|
|
|
@ -41,6 +41,8 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
/// <param name="logDetails">协议日志详情</param>
|
|
|
|
public void OnProtocolLogsReceived(IEnumerable<TransferProtocolLog> logDetails) |
|
|
|
{ |
|
|
|
_logger.LogInformation("OnProtocolLogsReceived 方法开始执行,线程ID: {ThreadId}", Thread.CurrentThread.ManagedThreadId); |
|
|
|
|
|
|
|
if (_disposed) |
|
|
|
{ |
|
|
|
_logger.LogWarning("NetworkProtocolLogObserver已释放,跳过日志处理"); |
|
|
|
@ -57,6 +59,8 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var logList = logDetails.ToList(); |
|
|
|
var logCount = logList.Count; |
|
|
|
|
|
|
|
_logger.LogInformation("OnProtocolLogsReceived 接收到日志数量: {LogCount}", logCount); |
|
|
|
|
|
|
|
if (logCount == 0) |
|
|
|
{ |
|
|
|
_logger.LogDebug("接收到的协议日志集合为空,跳过处理"); |
|
|
|
@ -64,15 +68,22 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
} |
|
|
|
|
|
|
|
// 使用锁保护整个处理过程,确保线程安全
|
|
|
|
_logger.LogInformation("OnProtocolLogsReceived 准备获取锁,线程ID: {ThreadId}", Thread.CurrentThread.ManagedThreadId); |
|
|
|
lock (_lock) |
|
|
|
{ |
|
|
|
_logger.LogInformation("OnProtocolLogsReceived 已获取锁,开始处理日志,线程ID: {ThreadId}", Thread.CurrentThread.ManagedThreadId); |
|
|
|
try |
|
|
|
{ |
|
|
|
ProcessLogsInternal(logList, logCount); |
|
|
|
_logger.LogInformation("OnProtocolLogsReceived 日志处理完成,线程ID: {ThreadId}", Thread.CurrentThread.ManagedThreadId); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "协议日志处理过程中发生异常,数量: {LogCount}", logCount); |
|
|
|
_logger.LogError(ex, "协议日志处理过程中发生异常,数量: {LogCount}, 线程ID: {ThreadId}", logCount, Thread.CurrentThread.ManagedThreadId); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
_logger.LogInformation("OnProtocolLogsReceived 释放锁,线程ID: {ThreadId}", Thread.CurrentThread.ManagedThreadId); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -84,14 +95,17 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
{ |
|
|
|
var startTime = DateTime.UtcNow; |
|
|
|
|
|
|
|
_logger.LogDebug("开始处理协议日志,数量: {LogCount}", logCount); |
|
|
|
_logger.LogInformation("ProcessLogsInternal 开始处理协议日志,数量: {LogCount}, 线程ID: {ThreadId}", logCount, Thread.CurrentThread.ManagedThreadId); |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
// 获取运行时配置键(外层已有锁保护)
|
|
|
|
_logger.LogInformation("ProcessLogsInternal 准备获取运行时配置键"); |
|
|
|
string runtimeCode = _context.GetNeConfigKey(); |
|
|
|
_logger.LogInformation("ProcessLogsInternal 获取到运行时配置键: {RuntimeCode}", runtimeCode); |
|
|
|
|
|
|
|
// 将 CoreAgent.ProtocolClient 的 TransferProtocolLog 转换为 WebSocket 传输层的 MessageTransferProtocolLog
|
|
|
|
_logger.LogInformation("ProcessLogsInternal 开始转换日志数据格式"); |
|
|
|
var webSocketLogs = logList.Select(log => new MessageTransferProtocolLog |
|
|
|
{ |
|
|
|
Id = log.Id, |
|
|
|
@ -110,28 +124,33 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
RuntimeCode = runtimeCode, |
|
|
|
}); |
|
|
|
|
|
|
|
ProtocolMessage message = new ProtocolMessage(webSocketLogs.ToArray()); |
|
|
|
var convertedLogs = webSocketLogs.ToArray(); |
|
|
|
_logger.LogInformation("ProcessLogsInternal 日志数据格式转换完成,转换后数量: {ConvertedCount}", convertedLogs.Length); |
|
|
|
|
|
|
|
ProtocolMessage message = new ProtocolMessage(convertedLogs); |
|
|
|
_logger.LogInformation("ProcessLogsInternal 创建协议消息完成"); |
|
|
|
|
|
|
|
// 尝试写入通道并跟踪结果
|
|
|
|
_logger.LogInformation("ProcessLogsInternal 准备写入通道,设备编码: {DeviceCode}", _context.DeviceCode); |
|
|
|
var writeSuccess = _ChannelManager.SendChannel.TryWrite(message); |
|
|
|
var processingTime = DateTime.UtcNow - startTime; |
|
|
|
|
|
|
|
if (writeSuccess) |
|
|
|
{ |
|
|
|
_logger.LogDebug("运行编码{RuntimeCode} 协议日志处理成功,数量: {LogCount}, 处理时间: {ProcessingTime}ms", |
|
|
|
runtimeCode, logCount, processingTime.TotalMilliseconds); |
|
|
|
_logger.LogInformation("运行编码{RuntimeCode} 协议日志处理成功,数量: {LogCount}, 处理时间: {ProcessingTime}ms, 线程ID: {ThreadId}", |
|
|
|
runtimeCode, logCount, processingTime.TotalMilliseconds, Thread.CurrentThread.ManagedThreadId); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_logger.LogWarning("运行编码{RuntimeCode} 协议日志写入通道失败,数量: {LogCount}, 处理时间: {ProcessingTime}ms, 通道可能已满或已关闭", |
|
|
|
runtimeCode, logCount, processingTime.TotalMilliseconds); |
|
|
|
_logger.LogWarning("运行编码{RuntimeCode} 协议日志写入通道失败,数量: {LogCount}, 处理时间: {ProcessingTime}ms, 通道可能已满或已关闭, 线程ID: {ThreadId}", |
|
|
|
runtimeCode, logCount, processingTime.TotalMilliseconds, Thread.CurrentThread.ManagedThreadId); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
var processingTime = DateTime.UtcNow - startTime; |
|
|
|
_logger.LogError(ex, "协议日志处理异常,数量: {LogCount}, 处理时间: {ProcessingTime}ms", |
|
|
|
logCount, processingTime.TotalMilliseconds); |
|
|
|
_logger.LogError(ex, "协议日志处理异常,数量: {LogCount}, 处理时间: {ProcessingTime}ms, 线程ID: {ThreadId}", |
|
|
|
logCount, processingTime.TotalMilliseconds, Thread.CurrentThread.ManagedThreadId); |
|
|
|
throw; // 重新抛出异常,让上层处理
|
|
|
|
} |
|
|
|
} |
|
|
|
|