dotnetcore控制台上的Microsoft.Extensions.Logging和Serilog。在RollingFile接收器中包含范围信息

时间:2017-06-28 13:56:14

标签: c# logging .net-core serilog

我正在使用Microsoft.Extensions.Logging.ILogger抽象,该抽象提供BeginScope函数,该函数在创建和处理范围之间的任何日志上添加分层信息。

ms的默认控制台提供程序运行良好,范围很有用。我希望我的Serilog RollingFile接收器也包含这些信息。

配置代码:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Is(LogEventLevel.Debug)
    .Enrich.WithThreadId()
    .Enrich.WithProcessId()
    .Enrich.WithProcessName()
    .Enrich.FromLogContext()
    .MinimumLevel.Debug()
    .WriteTo.RollingFile(pathFormat: "/opt/iqdata/logs/log-{Date}.txt", restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, retainedFileCountLimit:30, flushToDiskInterval:TimeSpan.FromSeconds(15), shared:true)
    .Enrich.WithProperty("process", "Worker")
    .CreateLogger();
var loggerFactory = new LoggerFactory().AddSerilog(Log.Logger).AddConsole(includeScopes: true, minLevel: LogLevel.Debug);

IConfigurationRoot config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile(path: "AppSettings.json", optional: false, reloadOnChange: true).Build();

provider = new ServiceCollection()
    .AddOptions()
    .AddSingleton(loggerFactory)
    .BuildServiceProvider();

logger = provider.GetService<ILoggerFactory>().CreateLogger("Worker.Program");
logger.LogDebug("Current directory:{CurrentDirectory}", Directory.GetCurrentDirectory());

那么我需要做什么才能将范围信息写入文件?另外作为奖励我该怎么做才能在RollingFile接收器中包含像ProcessName这样的丰富值?

1 个答案:

答案 0 :(得分:4)

您可以通过设置滚动文件接收器的outputTemplate参数来包含范围。 scope属性称为{Scope}

但是,使用Serilog 2.5,您可以在输出模板中使用{Properties}包括范围和任何其他丰富属性,如下所示。

.WriteTo.RollingFile("log-{Date}.txt",
    outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message} {Properties}{NewLine}{Exception}")