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