所以我正在将日志框架从 Log4Net 交换到 Serilog,在那里我们注销到一个文本文件。
我希望文本文件的格式与我之前的格式完全相同,以便用户无缝迁移。
因此,使用 Serilog 文件接收器,我可以修改 outputTemplate
以满足我的需求,但是我无法使 Serilogs 日志级别与 Log4Net 中的完全相同。
我希望有:
通过阅读 outputTemplates 的文档
https://github.com/serilog/serilog/wiki/Configuration-Basics#output-templates
For more compact level names, use a format such as {Level:u3} or {Level:w3} for three-character upper- or lowercase level names, respectively.
所以我尝试了以下方法来尝试获得 5 个大写字母
{Level:u5}
回来了:有没有人能给我指点一下?
最佳答案
在挖掘了 Serilog 的源代码后,我发现了 u3、w3 等的速记格式发生的地方,并提交了一个 PR,以便根据需要输出 5 个字符长度的日志级别。
在 Serilog 维护者的礼貌回应后,他们给了我一个更简单的解决方案来实现我自己的 ILogEventEnricher
向日志添加新属性,例如 {Log4NetLevel}
其中 Enricher 代码可以映射 Serilog 级别,以 Log4Net 将使用的确切格式输出。
然后我可以更新我的 outputTemplate 以使用我的新属性 {Log4NetLevel}
而不是 {Level:u5}
这是一个基本的例子
/// <summary>
/// This is used to create a new property in Logs called 'Log4NetLevel'
/// So that we can map Serilog levels to Log4Net levels - so log files stay consistent
/// </summary>
public class Log4NetLevelMapperEnricher : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
var log4NetLevel = string.Empty;
switch (logEvent.Level)
{
case LogEventLevel.Debug:
log4NetLevel = "DEBUG";
break;
case LogEventLevel.Error:
log4NetLevel = "ERROR";
break;
case LogEventLevel.Fatal:
log4NetLevel = "FATAL";
break;
case LogEventLevel.Information:
log4NetLevel = "INFO";
break;
case LogEventLevel.Verbose:
log4NetLevel = "ALL";
break;
case LogEventLevel.Warning:
log4NetLevel = "WARN";
break;
}
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Log4NetLevel", log4NetLevel));
}
}
然后我只需要更新我的 Serilog 配置以使用我的浓缩器,一个更干净的解决方案。感谢 Serilog 团队!
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.With<Log4NetLevelMapperEnricher>()
.WriteTo.File(
$@"{AppDomain.CurrentDomain.BaseDirectory}\App_Data\Logs\UmbracoTraceLog.{Environment.MachineName}.txt",
rollingInterval: RollingInterval.Day,
restrictedToMinimumLevel: LogEventLevel.Debug,
retainedFileCountLimit: null,
outputTemplate:
"{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel} {Message:lj}{NewLine}{Exception}")
.CreateLogger();
关于.net - 如何修改 Serilog 日志级别以匹配 Log4Net?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51629436/