所以我正在将日志框架从Log4Net交换到Serilog,我们在那里注销文本文件.
我希望文本文件的格式与之前完全相同,因此用户可以无缝迁移.
所以使用Serilog文件接收器,我能够修改它outputTemplate以满足我的需要,但是我无法让Serilogs日志级别与Log4Net中的完全相同.
我希望:
通过阅读outputTemplates的文档 https://github.com/serilog/serilog/wiki/Configuration-Basics#output-templates
对于更紧凑的级别名称,请分别对三个字符的大写或小写级别名称使用{Level:u3}或{Level:w3}等格式.
所以我尝试了以下尝试获得5个大写的字母{Level:u5}然后回来:
请问有人指点这个吗?
在深入了解Serilog的源代码之后,我发现了u3,w3等的简写格式正在发生并提交了一个PR,以便根据需要输出5个字符长度的日志级别.
在Serilog维护人员的礼貌回应之后,他们给了我一个更简单的实现我自己的解决方案,ILogEventEnricher在日志中添加一个新属性,例如{Log4NetLevel}Enricher代码可以映射Serilog Levels以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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后我只需要更新我的Serilog配置来使用我的richher,一个更清洁的解决方案.谢谢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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
804 次 |
| 最近记录: |