问题 如何使用Serilog ForContext


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

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

logger.Information("Test"); 

4687
2018-05-13 17:14


起源



答案:


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

要将报告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()

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


12
2018-05-18 12:35



更改为JSON Sink(也是针对普通文件)允许结构化日志记录(即所有字段)并且很容易被提取到Splunk等。 - user2864740


答案:


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

要将报告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()

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


12
2018-05-18 12:35



更改为JSON Sink(也是针对普通文件)允许结构化日志记录(即所有字段)并且很容易被提取到Splunk等。 - user2864740


使用以下代码记录:

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

然后您可以使用以下查询查询它:

select EventType,@Properties.CategoryName AS CategoryName,  @Message, @Properties
from stream  
where CategoryName = 'CategoryValue'
limit 1000

3
2018-06-23 10:24



这是哪里 stream 来自(哪里? - MEMark
@MEMark在他的例子中,我相信他正在用Seq查询他的日志 - Adam J.