Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin 使用serilog&xB4;MvvmCross中的s ForContext_Xamarin_Logging_Mvvmcross_Serilog - Fatal编程技术网

Xamarin 使用serilog&xB4;MvvmCross中的s ForContext

Xamarin 使用serilog&xB4;MvvmCross中的s ForContext,xamarin,logging,mvvmcross,serilog,Xamarin,Logging,Mvvmcross,Serilog,我使用xamarin MvvmCross并将serilog配置为记录器。 我试图将自定义变量添加到在上下文中传递它们的模板中,但我不知道如何做 这是我的serilog配置: var local = Application.Context.GetExternalFilesDir("").AbsolutePath; string path = Path.Combine(local, "my_log.txt"); Log.Logger = new Logger

我使用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);
    }
以及安卓系统的实现:

public class LogService : ILogService
    {
        public void LogMessage(string message)
        {
            Log.ForContext("myCustomVar", "varValue")
                        .Information(message);
        }
    }
有一种方法可以访问serilog的高级功能,例如使用MvvmCross/IMvx日志抽象层在上下文中传递变量?

为了使其工作,您需要这样做,而且由于MvvmCross集成的实现方式,您也需要这样做(它们不调用
ForContext
,而是调用
PushProperty

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

public override MvxLogProviderType GetDefaultLogProviderType() => MvxLogProviderType.Serilog;
并从您创建的Serilog logger创建一个
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();
}
为了让它正常工作,您还需要这样做,因为MvvmCross集成的实现方式(它们不调用
ForContext
,而是调用
PushProperty

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

public override MvxLogProviderType GetDefaultLogProviderType() => MvxLogProviderType.Serilog;
并从您创建的Serilog logger创建一个
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();
}