Logging 如何在log4net中以单个字母记录级别?
有没有办法更改此配置:Logging 如何在log4net中以单个字母记录级别?,logging,log4net,log4net-appender,Logging,Log4net,Log4net Appender,有没有办法更改此配置: <appender name="appender" type="log4net.Appender.RollingFileAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] [%-5level] %logger - %message%newline" /> </layout&
<appender name="appender" type="log4net.Appender.RollingFileAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] [%-5level] %logger - %message%newline" />
</layout>
</appender>
我尝试了%-1level
,但该数字仅控制要填充空格的字符数。([%-5level]
表示[INFO]
而不是[INFO]
)因此[%-1level]
给了我[INFO]
,而不是预期的[I]
我目前的想法:
方差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>
.
.
方差2
我想可以扩展log4net.Appender.RollingFileAppender并覆盖渲染方法,或者如果可能的话,覆盖其他渲染级别的内部方法。(尚未检查这是否真的可行)
问题:
有没有更简单的方法来实现这一点?(仅使用配置)最简单的解决方案,使用截断格式:
%.1level
而不是%-5level
应该截断输出,如图所示
唉,我没有时间现场测试。如果不起作用,请参阅下面我的初始答案
编辑:我没有正确阅读截断说明:
如果数据项长于最大字段,则额外的
从数据项的开头删除字符,而不是
自始至终
这不符合你的需要。请看一下如何编写自定义的PatternLayoutConverter
每个模式元素都基于一组用于处理用户所需模式的
PatternLayoutConverter
进行解析。最好的办法是创建一个特定的PatternLayoutConverter
,该转换器将按照您希望的格式记录级别。这是一个例子,我解释了使用特定日期时间格式的相同原理
在您的情况下,可以简单如下:
public class MyLevelPatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
writer.Write(loggingEvent.Level.DisplayName.Substring(0, 1));
}
}
你可以在左边和右边填充空格,但你只能截断开头-奇怪的是apache没有想到有人也会截断结尾-@samy:谢谢你的回答,我会仔细看看,好像这就是我的2。解决方案正确;-)
public class MyLevelPatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
writer.Write(loggingEvent.Level.DisplayName.Substring(0, 1));
}
}