如何修复Akka.Event.LogMessage中的“输入字符串格式不正确”错误?
看起来你遇到的核心问题是Akka.Net仍在使用默认的DefaultLogger,而不是你配置的SerilogLogger,这才导致了格式解析错误——因为DefaultLogger不支持Serilog的结构化日志语法(比如{@Message}),当它尝试处理这类日志时就会抛出FormatException。下面是一步步的解决方案:
1. 确保Akka配置正确加载到指定节点
你的loggers配置必须放在appsettings.json的Akka节点下,否则Akka系统启动时会忽略这个配置,回退到默认日志器。修改你的appsettings.json:
{ "Akka": { "loggers": ["Akka.Logger.Serilog.SerilogLogger, Akka.Logger.Serilog"], "logger-startup-timeout": "5s", "minimum-log-level": "Info" } }
logger-startup-timeout:给日志适配器足够的启动时间,避免超时回退到默认日志minimum-log-level:控制全局日志级别,按需调整
2. 禁用DefaultLogger,确保仅使用SerilogLogger
Akka默认会在loggers配置无效时自动启用DefaultLogger。要彻底避免这种情况:
- 确保
loggers数组中只包含SerilogLogger,不要保留任何默认日志器的条目 - 创建ActorSystem时,务必传入读取到的Akka配置,让系统加载你的日志设置:
// 在Startup.cs或Program.cs中创建ActorSystem var akkaConfig = Configuration.GetSection("Akka").Get<Config>(); var actorSystem = ActorSystem.Create("MyActorSystem", akkaConfig);
3. 移除手动注册的SerilogLoggingAdapter
你不需要在DI容器中手动注册SerilogLoggingAdapter——Akka会根据loggers配置自动创建对应的ILoggingAdapter实例。手动注册反而会导致DI实例和Akka内部实例冲突,所以删除这行代码:
// 移除这行! // services.AddSingleton<ILoggingAdapter, SerilogLoggingAdapter>();
4. 验证日志适配器是否生效
启动应用后,查看控制台日志,如果你看到类似下面的条目,说明SerilogLogger已经成功加载:
[INFO][...][akka://MyActorSystem/system] Logger[Akka.Logger.Serilog.SerilogLogger] started
如果仍然看到DefaultLogger相关的日志,说明配置没有被正确读取,需要检查:
- Akka配置节点是否正确
- Akka.Net和Akka.Logger.Serilog的NuGet包版本是否完全匹配(版本不兼容会导致适配器加载失败)
5. 关于日志格式的说明
切换到SerilogLogger后,你可以正常使用Serilog的结构化日志语法,比如:
_logger.Info("Message loaded: {@Message}", message);
这种语法会让Serilog将message对象序列化为结构化数据,方便后续分析。而{Message}则只会输出对象的ToString()结果,按需选择即可。
完成以上步骤后,DefaultLogger的格式错误应该就会消失,所有日志都会通过Serilog输出。
内容的提问来源于stack exchange,提问作者reckface

