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

gv8xihay  于 2023-05-15  发布在  Java
关注(0)|答案(5)|浏览(132)

我有一个正常的信息级日志的应用程序。我需要的是另外记录所有错误级别事件到单独的错误日志。我正在使用这样的配置:

<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>

此配置仅记录错误。如果我把信息级记录器放在第一位,那么它将只记录到一般的附加器,但错误记录器将不工作。我想让他们两个都工作。

vaqhlq81

vaqhlq811#

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

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

<appender name="GENERAL">
   <param name="Threshold" value="INFO"/>
</appender>

然后将这两个appender添加到日志记录器中:

<logger name="com.acme">
  <level value="INFO"/>
  <appender-ref ref="ERROR_FILE"/>
  <appender-ref ref="GENERAL"/>
</logger>

现在转到日志记录器的日志条目将被发送到两个附加器,但是由于它们具有不同的独立阈值,ERROR_FILE附加器将仅记录ERROR及以上。

j8ag8udp

j8ag8udp2#

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

<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>
qpgpyjmq

qpgpyjmq3#

你需要使用log4j过滤器:

<filter class="org.apache.log4j.varia.LevelRangeFilter">
    <param name="levelMin" value="ERROR" />
    <param name="levelMax" value="ERROR" />
</filter>

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

h7wcgrx3

h7wcgrx34#

如果您使用的是log4j2和XML格式的配置,ThresholdFilter是一个很好的解决方案。
下面是一个示例:

<?xml version="1.0" encoding="UTF-8"?>

      <Configuration status="WARN">

       <Appenders>
          <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <ThresholdFilter level="DEBUG"/>
    </Console>
    
    <RollingFile name="RollingDebugLogFile" fileName="logs/app-debug.log" filePattern="logs/$${date:yyyy-MM}/app-debug-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="20MB"/>
      </Policies>
      <ThresholdFilter level="DEBUG"/>
    </RollingFile>
  
    <RollingFile name="RollingErrorLogFile" fileName="logs/app-error.log" filePattern="logs/$${date:yyyy-MM}/app-error-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="20MB"/>
      </Policies>
      <ThresholdFilter level="ERROR"/>
    </RollingFile>
  
    <RollingFile name="RollingInfoLogFile" fileName="logs/app-info.log" filePattern="logs/$${date:yyyy-MM}/app-info-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="20MB"/>
      </Policies>
      <ThresholdFilter level="INFO"/>
    </RollingFile>
    
  </Appenders>

  <Loggers>
    <Logger name="testLogger" level="DEBUG" additivity="false">
        <AppenderRef ref = "Console" />
        <AppenderRef ref="RollingErrorLogFile" />
        <AppenderRef ref="RollingInfoLogFile" />
        <AppenderRef ref="RollingDebugLogFile" />
    </Logger>
    <Root level="INFO">
      <AppenderRef ref = "Console" />
      <AppenderRef ref="RollingErrorLogFile" />
      <AppenderRef ref="RollingInfoLogFile" />
      <AppenderRef ref="RollingDebugLogFile" />
    </Root>
    
  </Loggers>
</Configuration>
fsi0uk1n

fsi0uk1n5#

实际上,你可以使用.properties文件来实现;你不必使用.xml文件:

  • 仅记录警告
log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.appenderName.filter.a.LevelMin=WARN
log4j.appender.appenderName.filter.a.LevelMax=WARN
  • 从INFO到WARN的日志
log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.appenderName.filter.a.LevelMin=INFO
log4j.appender.appenderName.filter.a.LevelMax=WARN

相关问题