Akka.Net 1.5 Serilog 记录器在使用 ForContext 时不添加额外的属性

问题描述 投票:0回答:1

我正在尝试使用

ForContext()
向演员的记录器添加额外的属性。当前的 Akka.NET 文档表示,从 Akka.NET 1.5 版本开始,您应该能够使用
GetLogger()
,而不是
GetLogger<SerilogLoggingAdapter>()
,并且特定的
SerilogLoggingAdapter
仅在 Akka.net 1.4 中需要。

但是这似乎不起作用 - 我可以显示由

ForContext
设置的属性的唯一方法是使用显式
GetLogger<SerilogLoggingAdapter>()
方式。

是否有某种方法可以在 Actor 内部使用 ForContext 调用,而不必显式引用

SerilogLoggingAdapter

这是一个简单的例子 - actor MyActor 尝试双向发出消息,只有旧的方式可以让我访问该属性:

internal class Program
{
    static void Main(string[] args)
    {
        var logger = new LoggerConfiguration()
                        .WriteTo.Console(outputTemplate: "[From Context: {FromContextProperty}] [From Message:{FromMessageProperty}] {Message:lj}{NewLine}")
                        .MinimumLevel.Information()
                        .CreateLogger();

        Serilog.Log.Logger = logger;

        var systemConfig = @"
            akka {
                loglevel=DEBUG,  
                loggers=[""Akka.Logger.Serilog.SerilogLogger, Akka.Logger.Serilog""]
                logger-formatter=""Akka.Logger.Serilog.SerilogLogMessageFormatter, Akka.Logger.Serilog""
            }";

        using (var sys = ActorSystem.Create("mySystem", systemConfig)) 
        {
            Console.WriteLine("Enter some text to send to the actor, to log it");
            var act = sys.ActorOf<MyActor>();
            while (true)
            {
                act.Tell(Console.ReadLine());
            }
        }
    }
}

public class MyActor:ReceiveActor
{
    public MyActor() 
    {
        Receive<string>(txt =>
        {
            // this way does NOT render the FromContext property in the output, contrary to documentation
            Context.GetLogger()
            .ForContext("FromContextProperty", "bbb")
            .Error("NEW WAY {FromMessageProperty}", txt);

           Context.GetLogger<SerilogLoggingAdapter>()
           .ForContext("FromContextProperty", "bbb")
           .Error("OLD WAY {FromMessageProperty}", txt);
        }
        );
    }
}

产生的输出,请注意第一行中缺少的上下文属性: missing context property when using GetLogger()

使用的软件包版本:

 <ItemGroup>
   <PackageReference Include="Akka" Version="1.5.19" />
   <PackageReference Include="Akka.Logger.Serilog" Version="1.5.12.1" />
   <PackageReference Include="Serilog" Version="3.1.1" />
   <PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
 </ItemGroup>
serilog akka.net
1个回答
0
投票

当前的 Akka.NET 文档表示,从 Akka.NET 1.5 版本开始,您应该能够使用 GetLogger(),而不是 GetLogger(),并且仅在 Akka.net 1.4 中才需要特定的 SerilogLoggingAdapter。

所以我认为我们在 Akka.Hosting 文档中遗漏了这一点,但基本上现在可以普遍设置日志格式化程序。不过,在配置过程中需要执行此操作,您可以在此处查看:https://github.com/akkadotnet/Akka.Logger.Serilog/blob/ba72148dce96f26d1faccd2a6362ceaaef9e7eca/src/Examples/Akka.Hosting.LoggingDemo/程序.cs#L26-L37

© www.soinside.com 2019 - 2024. All rights reserved.