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
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));
|
|
}
|
|
}
|