在我的一个项目(.net core 3.1)中,我需要一种方法将System.Diagnostics.Trace.WriteLine重定向到Serilog文件。我发现了SerilogTraceListener包,它似乎是正确的候选者。
不幸的是,直到现在,我还没能找到让它工作的方法。
要重现它,1) 创建一个.net核心控制台项目 2) 添加以下nuget包:Serilog,SerilogTraceListener,Serilog.Sink.Console,Serilog.Sink.File 3) 用以下代码覆盖Program类代码
class Program
{
static void Main(string[] args)
{
// Works fine
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("log.txt")
.CreateLogger();
Log.Logger.Information("A string written using Logger.Information");
// Trace is written in the console but not in the file
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new global::SerilogTraceListener.SerilogTraceListener());
System.Diagnostics.Trace.WriteLine("A string written using Trace.WriteLine");
}
}
我做错了什么?
TL;DR; 你需要设置 MinimumLevel
到 Debug
或 Verbose
为了看到 Trace.WriteLine
消息。
SerilogTraceListener 地图 System.Diagnostic.TraceEventType
到 Serilog.LogEventLevel
而当你打电话 Trace.WriteLine
, 它将这些事件映射到 Debug
事件记录级.
这意味着Serilog的记录器正在接收一个类型为 LogEventLevel.Debug
.
在Serilog中默认配置的最小级别是 Information
这意味着 Debug
消息被抑制。
你必须配置 MinimumEventLevel
到 Debug
(或 Verbose
),以便查看 Trace.WriteLine
信息。
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.WriteTo.Console()
.WriteTo.File("log.txt")
.CreateLogger();