【问题标题】:Log4j2: Log ERROR level into a specific fileLog4j2:将错误级别记录到特定文件中
【发布时间】:2020-08-04 16:57:37
【问题描述】:

在我的 log4j2 配置中,我将 AsyncRoot 设置为 INFO,因为我想在文件中记录此级别和更高级别。

但我也想将 ERROR 级别记录到特定文件中,并在 AsyncRoot

中配置的附加程序中

这是我的配置:

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
    <Appenders>
        <RollingFile name="file" fileName="${LOG_PATH}/${APP_NAME}.log" filePattern="${LOG_PATH}/${APP_NAME}-${FILE_PATTERN_TRAILER}.log">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>
        <RollingFile name="errorFile" fileName="${LOG_PATH}/${APP_NAME}-errors.log" filePattern="${LOG_PATH}/${APP_NAME}-errors-${FILE_PATTERN_TRAILER}.log">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <AsyncRoot level="INFO">
            <AppenderRef ref="file"/>
        </AsyncRoot>

        <AsyncLogger level="ERROR">
            <AppenderRef ref="errorFile"/>
        </AsyncLogger>
    </Loggers>
</Configuration>

这是我想要实现的日志记录行为(无论包):

  • INFO 日志级别的所有日志都记录到 appender 文件
  • 所有具有 ERROR 日志级别的日志都记录到 appender fileerrorFile
  • 根本不记录所有具有较低日志级别(DEBUG、TRACE)的日志

谢谢

【问题讨论】:

    标签: log4j2


    【解决方案1】:

    您可以通过将root 记录器的级别设置为info 来实现您想要的,因为您不希望任何tracedebug 事件到达您的附加程序。将错误文件附加程序上的level 设置为error,以便仅将该级别或更具体的事件写入文件。

    这是一个简单的示例,您可以根据自己的需要进行调整:

    生成一些日志事件的Java类

    package example;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class SomeClass {
    
        private static final Logger log = LogManager.getLogger();   
    
        public static void main(String[] args){
            log.debug("This is some debug!");
            log.info("Here's some info!");
            log.error("Some error happened!");
        }
    }
    

    log4j2 XML 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <File name="ErrorFile" fileName="logs/errors.log" immediateFlush="false"
                append="false">
                <PatternLayout
                    pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            </File>
    
            <File name="InfoFile" fileName="logs/Info.log" immediateFlush="false"
                append="false">
                <PatternLayout
                    pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            </File>
        </Appenders>
    
        <Loggers>
            <Root level="info">
                <AppenderRef ref="InfoFile" />
                <AppenderRef ref="ErrorFile" level="error" />
            </Root>
        </Loggers>
    </Configuration>
    

    这会生成 2 个文件:errors.log 和 Info.log

    错误日志只包含错误:

    2019-12-04 10:05:34.672 [main] ERROR example.SomeClass - Some error happened!
    

    信息日志包含信息和错误事件:

    2019-12-04 10:05:34.670 [main] INFO  example.SomeClass - Here's some info!
    2019-12-04 10:05:34.672 [main] ERROR example.SomeClass - Some error happened!
    

    【讨论】:

      【解决方案2】:

      要在属性配置文件中做类似的事情,你可以设置配置文件如下

      status = error
      name = PropertiesConfig
       
      filters = threshold
       
      filter.threshold.type = ThresholdFilter
      filter.threshold.level = debug
       
      appenders = rolling, rollingErrorFile
       
      appender.rolling.type = RollingFile
      appender.rolling.name = RollingFile
      appender.rolling.fileName = logs.log
      appender.rolling.filePattern = logs.log.%i
      appender.rolling.layout.type = PatternLayout
      appender.rolling.layout.pattern = %d{ISO8601} %-5p %30.30c{2} : %m%n
      appender.rolling.policies.type = Policies
      appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
      appender.rolling.policies.size.size=20 MB
      appender.rolling.strategy.type = DefaultRolloverStrategy
      appender.rolling.strategy.max = 20
      
      appender.rollingErrorFile.type = RollingFile
      appender.rollingErrorFile.name = RollingErrorFile
      appender.rollingErrorFile.fileName = logsErrors.log
      appender.rollingErrorFile.filePattern = logsErrors.log.%i
      appender.rollingErrorFile.layout.type = PatternLayout
      appender.rollingErrorFile.layout.pattern = %d{ISO8601} %-5p %30.30c{2} : %m%n
      appender.rollingErrorFile.policies.type = Policies
      appender.rollingErrorFile.policies.size.type = SizeBasedTriggeringPolicy
      appender.rollingErrorFile.policies.size.size=20 MB
      appender.rollingErrorFile.strategy.type = DefaultRolloverStrategy
      appender.rollingErrorFile.strategy.max = 20
       
      loggers = rolling
       
      #Make sure to change the package structure as per your application
      logger.rolling.name = example
      logger.rolling.level = debug
      logger.rolling.additivity = false
      logger.rolling.appenderRef.rolling.ref = RollingFile
      logger.rolling.appenderRef.rollingErrorFile.ref = RollingErrorFile
      logger.rolling.appenderRef.rollingErrorFile.level = error
      

      【讨论】:

        猜你喜欢
        • 2017-08-21
        • 2018-04-15
        • 2017-11-01
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多