如何将自己的属性添加到Serilog输出模板

时间:2018-02-02 22:31:53

标签: c# logging serilog

我有一个小应用程序正在接收来自服务总线的消息,该服务总线可以为不同的用户发送几种不同类型的事件。根据事件的类型,调用不同的函数。我在每个功能中记录信息。

我目前有这个:

var logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console(outputTemplate:
        "[{Timestamp:HH:mm:ss} {Level:u3}] {Message}{NewLine}{Exception}")
    .WriteTo.Loggly()
    .CreateLogger();

...

// logging an event
Log.Information("{UserId} {Event} - Here is my message", "123", "Test Event");

这很好,但是因为对于这个应用程序,每个日志都会在日志中包含UserId和Event数据,我想我可以将它们添加到我的输出模板中,以使我的日志代码更清晰一些。所以我试过这个:

var logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console(outputTemplate:
      "[{Timestamp:HH:mm:ss} {Level:u3}] {UserId} {Event} - {Message}{NewLine}{Exception}")
    .WriteTo.Loggly()
    .CreateLogger();

...

// logging an event
Log.Information("Here is my message", "123", "Test Event");
Log.Information("Here is my message", new { UserId = "123", Event = "Test Event"});

这些都不起作用,它输出的只是我的信息,它没有通过我传入其中的UserId或事件。

我这样做错了吗?或者甚至有办法做到这一点?

2 个答案:

答案 0 :(得分:6)

如果要添加不属于消息模板的属性,则需要丰富日志上下文。这意味着添加日志上下文更丰富,并将您的属性添加到您记录的事件有点不同。

Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .MinimumLevel.Information()
    .WriteTo.Console(outputTemplate:
    "[{Timestamp:HH:mm:ss} {Level:u3}] {UserId} {Event} - {Message}{NewLine}{Exception}")
    .CreateLogger();

using (LogContext.PushProperty("UserId", "123"))
using (LogContext.PushProperty("Event", "Test Event"))
{
    Log.Information("Here is my message about order {OrderNumber}", 567);
    Log.Information("Here is my message about product {ProductId}", "SomeProduct");
}

您可以在the documentation了解有关浓缩的更多信息。

现在我对Loggly不太确定。我以前从没用过它。但是,如果您使用Seq(来自Serilog的创建者并且最适合它),您甚至不需要修改输出模板。添加的属性将自动用于每个事件。

正如尼古拉斯·布鲁姆哈特(Nicholas Blumhardt)通过评论指出的那样,如果你只需要一次性地为一个记录的事件添加一个属性,你也可以这样做。我有时会这样做,因为我有很多属性用于不一定需要在消息中显示的事件,并且仅适用于此单个事件。

Log
   .ForContext("OrderNumber", orderNumber)
   .ForContext("UserId", user.Id)
   .Information("Order {OrderNumber} submitted", order.OrderNumber);

答案 1 :(得分:0)

您可以使用Enrich.WithProperty("ProperyName", "PropertyValue")

Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
                .MinimumLevel.Override("System", Serilog.Events.LogEventLevel.Warning)
                .WriteTo.File(new Serilog.Formatting.Json.JsonFormatter(), "D:\\Temp\\Serilogs\\structuredLog.json", rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information)
                .Enrich.FromLogContext()
                .Enrich.WithMachineName()
                .Enrich.WithProcessId()
                .Enrich.WithThreadId()
                .Enrich.WithProperty("ApplicationName", "Serilogs DemoApplication")
                .CreateLogger();