我有一个小应用程序正在接收来自服务总线的消息,该服务总线可以为不同的用户发送几种不同类型的事件。根据事件的类型,调用不同的函数。我在每个功能中记录信息。
我目前有这个:
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或事件。
我这样做错了吗?或者甚至有办法做到这一点?
答案 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();