作者:手机用户2602939543 | 来源:互联网 | 2022-12-09 01:06
所以我正在将日志框架从Log4Net交换到Serilog,我们在那里注销文本文件.
我希望文本文件的格式与之前完全相同,因此用户可以无缝迁移.
所以使用Serilog文件接收器,我能够修改它outputTemplate
以满足我的需要,但是我无法让Serilogs日志级别与Log4Net中的完全相同.
我希望:
错误
信息
警告
DEBUG
等等...
通过阅读outputTemplates的文档
https://github.com/serilog/serilog/wiki/Configuration-Basics#output-templates
对于更紧凑的级别名称,请分别对三个字符的大写或小写级别名称使用{Level:u3}或{Level:w3}等格式.
所以我尝试了以下尝试获得5个大写的字母{Level:u5}
然后回来:
Infor公司
错误
Warni
调试
等等..
请问有人指点这个吗?
1> Warren Buckl..:
在深入了解Serilog的源代码之后,我发现了u3,w3等的简写格式正在发生并提交了一个PR,以便根据需要输出5个字符长度的日志级别.
在Serilog维护人员的礼貌回应之后,他们给了我一个更简单的实现我自己的解决方案,ILogEventEnricher
在日志中添加一个新属性,例如{Log4NetLevel}
Enricher代码可以映射Serilog Levels以Log4Net将使用的确切格式输出.
然后我可以更新我的outputTemplate以使用我的新属性{Log4NetLevel}
而不是{Level:u5}
这是一个基本的例子
///
/// 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
///
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配置来使用我的richher,一个更清洁的解决方案.谢谢Serilog团队!
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.With()
.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();