【发布时间】:2019-03-18 03:53:49
【问题描述】:
我试图弄清楚如何让 Serilog 记录类名和方法/行号,就像我在 C++ 中使用 log4cxx 时看到的那样。
我尽力从我正在处理的真实代码中提取所有相关部分,并提出一个最小的示例。
我也一直在左右搜索 Serilog,但我没有找到好的文档。我想这是因为基础 serilog 之上有很多库,每个库都需要有自己的文档来告诉我如何做事。
我可以在 https://github.com/serilog/serilog/wiki/Configuration-Basics 看到有关配置的基础知识,但这似乎使用了来自单独的 Serilog 库和自定义格式化程序的 TextWriter 接收器,这两者我都不太了解。
我还可以找到使用简单配置和丰富调用来记录类和方法名称的堆栈溢出示例。
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();
}
}
}
【问题讨论】: