You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Akka.Event.LogMessage中的“输入字符串格式不正确”错误?

解决Akka.Net搭配Serilog时的DefaultLogger格式错误问题

看起来你遇到的核心问题是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:00:54