【问题标题】:Using serilog´s ForContext in MvvmCross在 MvvmCross 中使用 serilog 的 ForContext
【发布时间】:2021-01-04 16:51:56
【问题描述】:

我正在使用 xamarin MvvmCross 并将 serilog 配置为记录器。 我正在尝试将自定义变量添加到在上下文中传递它们的模板中,但我不知道该怎么做。

这是我的 serilog 配置:

var local = Application.Context.GetExternalFilesDir("").AbsolutePath;
string path = Path.Combine(local, "my_log.txt");

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.File(path,
        rollingInterval: RollingInterval.Day,
        outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss zzz} {myCustomVar} [{Level:u3}] {Message:lj}")
    .CreateLogger();

在我的 ViewModel 中,我正在尝试记录一条消息:

using (_logProvider.OpenMappedContext("myCustomVar","varValue"))
            {
                _log.Info("Good Morning");
            }

到 my_log.txt 的行输出不包含“myCustomVar”的值。

我发现让它工作的唯一方法是完全绕过 MvvmCross 并编写一个直接调用 serilog 的自定义记录器,如下所示:

    public interface ILogService
    {
        void LogMessage(string message);
    }

和android实现:

public class LogService : ILogService
    {
        public void LogMessage(string message)
        {
            Log.ForContext("myCustomVar", "varValue")
                        .Information(message);
        }
    }

有没有办法访问 serilog 的高级功能,例如使用 MvvmCross/IMvx 日志抽象层在上下文中传递变量?

【问题讨论】:

    标签: xamarin logging mvvmcross serilog


    【解决方案1】:

    您需要connect Serilog and MvvmCross together 才能使其工作,并且您还需要enrich with properties from the log context 因为MvvmCross 集成的实现方式(他们不调用ForContext,而是调用PushProperty) .

    覆盖平台项目的Setup.cs 中的GetDefaultLogProviderType

    public override MvxLogProviderType GetDefaultLogProviderType() => MvxLogProviderType.Serilog;
    

    并从您创建的 Serilog 记录器创建一个 IMvxLogProvider

    protected override IMvxLogProvider CreateLogProvider()
    {
        var local = Application.Context.GetExternalFilesDir("").AbsolutePath;
        string path = Path.Combine(local, "my_log.txt");
    
        Log.Logger = new LoggerConfiguration()
          .MinimumLevel.Verbose()
          .Enrich.FromLogContext()
          .WriteTo.File(path,
              rollingInterval: RollingInterval.Day,
              outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss zzz} {myCustomVar} [{Level:u3}] {Message:lj}")
          .CreateLogger();
    
          return base.CreateLogProvider();
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2022-11-02
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多