【问题标题】:How to use Serilog ForContext如何使用 Serilog ForContext
【发布时间】:2014-07-01 12:08:40
【问题描述】:

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

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

logger.Information("Test"); 

【问题讨论】:

    标签: .net logging serilog


    【解决方案1】:

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

    要将报告 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,将使基于属性值查看和关联事件变得更好。

    【讨论】:

    • 更改为 JSON Sink(也针对纯文件)允许结构化日志记录(即所有字段),并且很容易被摄取到 Splunk 等中。
    【解决方案2】:

    使用以下代码记录:

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

    然后你可以使用下面的查询来查询它:

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

    【讨论】:

    • 这个stream来自哪里?
    • @MEMark 在他的例子中,我相信他正在使用 Seq 查询他的日志
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2018-07-17
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多