using Microsoft.Extensions.Logging;
namespace CoreAgent.WebSocketTransport.Middleware;
///
/// 日志中间件
/// 记录发送/接收消息,跳过心跳消息如 PING/PONG
///
public class LoggingMiddleware : IMessageMiddleware
{
private readonly ILogger _logger;
private static readonly string[] _heartbeatMessages = { "PING", "PONG" };
public LoggingMiddleware(ILogger logger)
{
_logger = logger;
}
///
/// 处理发送消息,记录日志(跳过心跳消息)
///
public Task ProcessSendAsync(T message, CancellationToken cancellationToken = default)
{
if (message == null)
{
_logger.LogWarning("发送消息为空");
return Task.FromResult(default);
}
var messageStr = message.ToString();
// 跳过心跳消息的日志记录
if (IsHeartbeatMessage(messageStr))
{
return Task.FromResult(message);
}
_logger.LogInformation("发送消息: {MessageType} - {MessageContent}",
typeof(T).Name,
messageStr);
return Task.FromResult(message);
}
///
/// 处理接收消息,记录日志(跳过心跳消息)
///
public Task ProcessReceiveAsync(T message, CancellationToken cancellationToken = default)
{
if (message == null)
{
_logger.LogWarning("接收消息为空");
return Task.FromResult(default);
}
var messageStr = message.ToString();
// 跳过心跳消息的日志记录
if (IsHeartbeatMessage(messageStr))
{
return Task.FromResult(message);
}
_logger.LogInformation("接收消息: {MessageType} - {MessageContent}",
typeof(T).Name,
messageStr);
return Task.FromResult(message);
}
///
/// 判断是否为心跳消息
///
private static bool IsHeartbeatMessage(string? message)
{
if (string.IsNullOrEmpty(message))
return false;
return _heartbeatMessages.Any(hb => message.Contains(hb, StringComparison.OrdinalIgnoreCase));
}
}