有没有办法更改此配置:
<appender name="appender" type="log4net.Appender.RollingFileAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] [%-5level] %logger - %message%newline" />
</layout>
</appender>
...将日志级别记录为单个字母,如下所示:
DEBUG -> D
INFO -> I
WARN -> W
ERROR -> E
FATAL -> F
我尝试了%-1level
,但这个数字只能控制要填充空格的字符数。 ([%-5level]
表示[INFO ]
而不是[INFO]
)所以[%-1level]
给了我[INFO]
而不是预期的[I]
。
到目前为止我的想法:
Variante 1
我可以为每个级别配置一个单独的appender,其中为每个级别设置固定级别字母,所有级别都记录到同一个文件:
<appender name="info-appender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="logfile.log" />
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="INFO" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] [I] %logger - %message%newline" />
</layout>
</appender>
<appender name="warn-appender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="logfile.log" />
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="WARN" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] [W] %logger - %message%newline" />
</layout>
</appender>
.
.
<root>
<level value="ALL" />
<appender-ref ref="debug-appender" />
<appender-ref ref="info-appender" />
<appender-ref ref="warn-appender" />
<appender-ref ref="error-appender" />
<appender-ref ref="fatal-appender" />
</root>
Variante 2
我想可以扩展log4net.Appender.RollingFileAppender
并覆盖render方法,或者如果可能的话,还可以使用其他一些呈现级别的内部方法。 (还没检查那是否真的可能)
问题:
有没有更简单的方法来实现这个目标? (只是配置)
答案 0 :(得分:0)
最简单的解决方案,使用截断格式:%.1level
而不是%-5level
应该截断输出,如图here所示
编辑:我没有正确阅读截断的描述:
如果数据项长于最大字段,则额外 字符将从数据项的开头删除而不是 从最后
与您的需求不符。请查看编写自定义PatternLayoutConverter
每个模板元素都是根据PatternLayoutConverter
的集合进行解析的,这些集合用于处理用户所需的模式。您最好的选择是创建一个特定的PatternLayoutConverter
,它会根据您的意愿记录格式。 Here是一个示例,我解释了使用特定日期时间格式的相同原则。
在你的情况下,它可以像这样简单:
public class MyLevelPatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
writer.Write(loggingEvent.Level.DisplayName.Substring(0, 1));
}
}