因此,我正在将日志框架从Log4Net交换到Serilog,然后我们注销到文本文件。
我希望文本文件的格式与以前完全相同,以便用户无缝迁移。
因此,使用Serilog文件接收器,我可以修改outputTemplate
以适合自己的需要,但是我无法获得Serilogs日志级别以完全匹配Log4Net。
我希望拥有:
通过阅读outputTemplates的文档 https://github.com/serilog/serilog/wiki/Configuration-Basics#output-templates
要获得更紧凑的级别名称,请分别使用{Level:u3}或{Level:w3}这样的格式来表示三个字符的大写或小写级别名称。
因此,我尝试了以下方法,尝试获取5个字母大写的{Level:u5}
并返回:
有人能给我一个指导吗?
答案 0 :(得分:5)
仔细阅读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配置即可使用我的richer,这是一种更加干净的解决方案。 谢谢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();