Xamarin 使用serilog&xB4;MvvmCross中的s ForContext
我使用xamarin MvvmCross并将serilog配置为记录器。 我试图将自定义变量添加到在上下文中传递它们的模板中,但我不知道如何做 这是我的serilog配置: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
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();
}