升级Akka .Net 1.5后Serilog语义日志属性丢失问题
问题排查与修复:Akka.NET 1.5升级后Serilog语义属性丢失
核心问题分析
从配置和代码来看,问题出在日志适配器的使用方式以及Akka.NET与Serilog集成的版本兼容性上,导致日志模板中的语义属性无法被正确解析和传递。
修复步骤
1. 对齐Akka.NET与Akka.Logger.Serilog版本
确保Akka和Akka.Logger.Serilog的NuGet包版本完全一致(均为1.5.x系列)。版本不匹配会导致日志集成模块无法正确处理语义属性,这是Akka.NET 1.5升级后常见的兼容性问题。
2. 修正Actor中日志器的获取方式
你当前手动指定了SerilogLoggingAdapter泛型参数,这会绕过Akka.NET根据HOCON配置自动注入的日志器逻辑,导致语义属性丢失。修改代码如下:
原代码:
private readonly ILoggingAdapter _logger = Context.GetLogger<SerilogLoggingAdapter>();
修改为:
private readonly ILoggingAdapter _logger = Context.GetLogger();
Akka.NET会根据HOCON中配置的loggers自动使用SerilogLogger对应的适配器,无需手动指定类型。
3. 确保Serilog初始化在ActorSystem启动之前
必须在创建ActorSystem实例前完成Log.Logger的初始化,否则Akka.NET会创建一个默认的Serilog实例,与你自定义配置的实例不关联,导致语义属性无法传递到Application Insights。示例代码顺序:
// 优先初始化Serilog var serilogConfig = new LoggerConfiguration() .WriteTo.ApplicationInsightsTelemetrySink("<你的Instrumentation Key>") // 其他Serilog配置项 .CreateLogger(); Log.Logger = serilogConfig; // 再创建ActorSystem var actorSystem = ActorSystem.Create("my-actor-system");
4. 验证HOCON配置有效性
你的HOCON配置本身是正确的,但需确保没有其他配置项覆盖logger-formatter:
akka { loglevel=INFO log-dead-letters = off log-dead-letters-during-shutdown = off loggers=["Akka.Logger.Serilog.SerilogLogger, Akka.Logger.Serilog"] logger-formatter="Akka.Logger.Serilog.SerilogLogMessageFormatter, Akka.Logger.Serilog" actor { ask-timeout = 60s } }
SerilogLogMessageFormatter负责将Akka的日志模板转换为Serilog可识别的语义格式,无需修改。
验证修复效果
修复后,日志输出的properties节点应包含MyExtraPropName属性,类似如下结构:
{ "name": "AppTraces", "time": "2023-05-11T09:01:21.9089715Z", "data": { "baseType": "MessageData", "baseData": { "ver": 2, "message": "Doing a thing on a log \"MyExtraPropValue\"", "severityLevel": "Information", "properties": { "LogSource": "[akka://my-actor-system/user/my-actor#1234344381]", "Timestamp": "2023-05-11T09:01:21.9089046Z", "Message": "Doing a thing on a log \"MyExtraPropValue\"", "Thread": "0044", "SourceContext": "MyProject.MyActorClass", "MessageTemplate": "Doing a thing on a log '{MyExtraPropName}'", "ActorPath": "akka://my-actor-system/user/my-actor", "MyExtraPropName": "MyExtraPropValue" } } } }
内容的提问来源于stack exchange,提问作者Tjaart
相关产品推荐
相关产品推荐

