如何在log4net中将级别记录为单个字母?

时间:2015-08-18 14:29:19

标签: 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>

...将日志级别记录为单个字母,如下所示:

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方法,或者如果可能的话,还可以使用其他一些呈现级别的内部方法。 (还没检查那是否真的可能)

问题:

有没有更简单的方法来实现这个目标? (只是配置)

1 个答案:

答案 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));
    }
}