Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 如何在log4net中以单个字母记录级别?_Logging_Log4net_Log4net Appender - Fatal编程技术网

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