简体   繁体   English

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

[英]How to configure log4j to log different log levels to different files for the same logger

I have a normal INFO level log for application.我有一个正常的 INFO 级别的应用程序日志。 What I need is to additionally log all ERROR level events to separate error log.我需要的是另外记录所有错误级别的事件以分隔错误日志。 I am using configuration like this:我正在使用这样的配置:

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

This configuration logs errors only.此配置仅记录错误。 If I put info level logger first, then it will log only to general appender, but error logger will not work.如果我首先放置信息级别记录器,那么它只会记录到一般的附加程序,但错误记录器将不起作用。 I would like to have them both working.我想让他们都工作。

What you need to do is have a single <logger> definition with a defined level of INFO, but in your two appender definitions, you set their thresholds accordingly, eg您需要做的是具有定义级别的 INFO 的单个<logger>定义,但是在您的两个 appender 定义中,您相应地设置了它们的阈值,例如

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

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

You then add both appenders to your logger:然后将两个 appender 添加到记录器中:

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

Log entries now going to the logger will get sent to both appenders, but since they have different independent thresholds, the ERROR_FILE appender will only log ERROR and above.现在进入记录器的日志条目将被发送到两个 appender,但由于它们具有不同的独立阈值,因此 ERROR_FILE appender 只会记录 ERROR 及以上。

Full working solution including the date in the filename:完整的工作解决方案,包括文件名中的日期:

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

You need to use log4j filters:您需要使用 log4j 过滤器:

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

That way you can create log files for each level separately.这样您就可以分别为每个级别创建日志文件。

If you are using log4j2 and config with XML format, ThresholdFilter is a good solution.如果您使用的是 log4j2 和 XML 格式的配置, ThresholdFilter是一个很好的解决方案。

Here is a sample:这是一个示例:

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

Well, actually, you can do it using .properties file;好吧,实际上,您可以使用 .properties 文件来实现; you don't have to use .xml file :您不必使用 .xml 文件:

  • Log only WARN仅记录警告

    log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter log4j.appender.appenderName.filter.a.LevelMin=WARN log4j.appender.appenderName.filter.a.LevelMax=WARN
  • Log from INFO to 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用Log4j使用同一记录器登录到不同文件 - Log into different files with the same logger with Log4j 使用log4j将不同的日志级别记录到不同的文件中 - log different log levels to different files with log4j 如何使用相同的log4j记录器为不同的包创建不同的日志文件? - How to create different log files for different packages using same log4j logger? log4j (1.2.15) 从同一个 package 记录不同日志级别的不同 DailyRollingFileAppender 日志文件? - log4j (1.2.15) logging to different DailyRollingFileAppender log files for different log levels from same package? Log4j中日志级别的不同布局 - Different Layouts for Log Levels in Log4j 如何使用log4j的相同记录器将不同的信息写入两个不同的文件? - how to write different information to two different files using same logger of log4j? 如何配置log4j2的log4j2.properties文件,使其具有带有2个不同级别的附加程序的记录器? - How to configure log4j2.properties file for log4j2 to have a logger with 2 appenders with different levels? 如何为不同的附加程序配置log4j - how to configure log4j for different appenders 如何使用带有不同配置文件的Spring Framework配置log4j - How to configure log4j with Spring Framework with different configuration files 使用Log4J在同一个类中使用不同的Logger - Different Logger in the same class using Log4J
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM