17

我是 Serilog 的新手,我很难弄清楚如何使用上下文功能。当我在输出文件下面运行代码时,不包含报告 ID。有什么我想念的想法吗?

var logger = new LoggerConfiguration()
                .WriteTo
                .File(@"C:\Log.txt")
                .CreateLogger()
                .ForContext("Report ID", 10);

logger.Information("Test"); 
4

2 回答 2

24

并非所有附加到日志事件的属性都将由附加到记录器的所有接收器呈现;这里使用的文件接收器只包括时间戳、级别、消息等。

要将报告 ID 放入文件中,请将其包含在接收器的outputTemplate:

var logger = new LoggerConfiguration()
  .WriteTo.File(@"C:\Log.txt",
    outputTemplate: "{Timestamp:u} [{Level}] ({ReportId}) {Message}{NewLine}{Exception}")
  .CreateLogger()
  .ForContext("ReportId", 10);

logger.Information("Test"); 

这将在每条消息中包含报告 ID。

ForContext通常用于创建较短的临时范围;如果您希望所有消息都具有相同的属性,则可以使用Enrich.WithProperty()

var logger = new LoggerConfiguration()
  .Enrich.WithProperty("ReportId", 10);
  .WriteTo.File(@"C:\Log.txt",
    outputTemplate: "{Timestamp:u} [{Level}] ({ReportId}) {Message}{NewLine}{Exception}")
  .CreateLogger()

平面文件是使用结构化日志快速启动和运行的好方法,但使用更适合结构化存储的数据存储,例如CouchDBRavenDBSeq将更好地查看和关联基于属性值的事件。

于 2014-05-18T12:35:28.190 回答
3

使用以下代码记录:

Log.ForContext("CategoryName", "CategoryValue").Information("My Info");

然后您可以使用以下查询对其进行查询:

select EventType,@Properties.CategoryName AS CategoryName,  @Message, @Properties
from stream  
where CategoryName = 'CategoryValue'
limit 1000
于 2017-06-23T10:24:07.610 回答