如何配置log4j以将不同的日志级别记录到同一记录器的不同文件中

vil*_*nts 55 java logging log4j

我有一个正常的INFO级别日志用于应用程序.我需要的是另外记录所有ERROR级事件以分离错误日志.我正在使用这样的配置:

<logger name="com.acme">
  <level value="error"/>
  <appender-ref ref="error"/>
</logger>

<logger name="com.acme">
  <level value="info"/>
</logger>

<root>
  <level value="warn"/>
  <appender-ref ref="general"/>
</root>
Run Code Online (Sandbox Code Playgroud)

此配置仅记录错误.如果我首先放置信息级别记录器,那么它将仅记录到常规appender,但错误记录器将不起作用.我想让他们都工作.

ska*_*man 74

您需要做的是具有<logger>定义的INFO级别的单个定义,但是在您的两个appender定义中,您可以相应地设置它们的阈值,例如

<appender name="ERROR_FILE">
   <param name="Threshold" value="ERROR"/>
</appender>

<appender name="GENERAL">
   <param name="Threshold" value="INFO"/>
</appender>
Run Code Online (Sandbox Code Playgroud)

然后,将两个appender添加到记录器:

<logger name="com.acme">
  <level value="INFO"/>
  <appender-ref ref="ERROR_FILE"/>
  <appender-ref ref="GENERAL"/>
</logger>
Run Code Online (Sandbox Code Playgroud)

现在进入记录器的日志条目将被发送到两个appender,但由于它们具有不同的独立阈值,因此ERROR_FILE appender将仅记录ERROR及更高版本.

  • 但是我想允许我的 ERROR_FILE appender 获取其他一些记录器的选定调试消息?! (2认同)

小智 11

完整的解决方案,包括文件名中的日期:

<appender name="InfoFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="FileNamePattern" value="/var/output/Info_%d{ddMMyyyy}.log" />
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
      <param name="levelMin" value="INFO" />
      <param name="levelMax" value="INFO" />
    </filter>
</appender>

<appender name="ErrorFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
    <param name="Threshold" value="ERROR" />
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="FileNamePattern" value="/var/output/Error_%d{ddMMyyyy}.log" />
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
    </layout>
</appender>
<root>
    <level value="INFO" />
    <appender-ref ref="InfoFileAppender" />
    <appender-ref ref="ErrorFileAppender" />
</root>
Run Code Online (Sandbox Code Playgroud)


小智 5

您需要使用log4j过滤器:

<filter class="org.apache.log4j.varia.LevelRangeFilter">
    <param name="levelMin" value="ERROR" />
    <param name="levelMax" value="ERROR" />
</filter>
Run Code Online (Sandbox Code Playgroud)

这样,您可以分别为每个级别创建日志文件。