You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.3 KiB

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