使用TextWriter

时间:2018-10-12 22:12:06

标签: c# serilog

我试图弄清楚如何获取Serilog来记录类名和方法/行号,就像在C ++中使用log4cxx看到的那样。

我尽力从正在处理的真实代码中获取所有相关信息,并提供一个最小的示例。

我也一直在左右搜索Google Serilog,但找不到很好的文档。我想这是因为基本serilog之上有太多库,每个库都需要有自己的文档来告诉我如何做。

我可以在https://github.com/serilog/serilog/wiki/Configuration-Basics上看到有关配置的基础知识,但这似乎使用了来自单独的Serilog库和自定义格式化程序的TextWriter接收器,这两个我都不十分了解。

我还可以找到有关堆栈溢出的示例,这些示例使用简单的配置和rich调用来记录类和方法的名称。

C# ASP.NET Core Serilog add class name and method to log

我无法记录它们。在仍然使用自定义格式器和TextWriter的情况下,如何获取此信息以记录类和方法名或行号?

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Serilog;
using Serilog.Events;
using Serilog.Formatting;

namespace SerilogDemo {

    // Someone else made this, I just changed the name to protect the innocent
    public class SomeonesLogTextFormatter : ITextFormatter
    {
        public void Format(LogEvent logEvent, TextWriter output)
        {
            output.Write(logEvent.Level);
            output.Write(": ");
            logEvent.MessageTemplate.Render(logEvent.Properties, output);
            output.WriteLine();

            if (logEvent.Exception != null)
            {
                output.WriteLine(logEvent.Exception);
            }
        }
    }

    public class SomeClass
    {
        private Serilog.ILogger _log = Serilog.Log.ForContext<SomeClass>();

        public SomeClass()
        {
            _log.Debug("SomeClass has been instantiated");
        }

        public void Foo()
        {
            _log.Debug("Foo has been called");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()
                .WriteTo.TextWriter(textWriter: Console.Out, formatter: new SomeonesLogTextFormatter())
                .CreateLogger();

            var poop = new SomeClass();
            poop.Foo();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

向日志消息中添加更多信息的Serilog方法是通过手动或使用为您执行此操作的Enricher向LogContext添加属性。进一步了解Serilog Enrichment

默认情况下,Serilog不会捕获该信息,并且如果您对每条消息都这样做,则可能会非常昂贵,但是做到这一点的方法是使用C#'s Caller Information feature,例如CallerMemberName,{{ 1}},CallerFilePath

Here is an example,也在下面复制:

CallerLineNumber