每个级别使用单独的 Log4j Core 日志文件

问题描述 投票:0回答:1

我希望将我的 警告错误信息保存在单独的文件中。所有 2 个文件都是自动创建的,但是在 info.log 中,我也看到 warnings。如何修复 log4j2.xml,以便所有三个文件,即 warn.loginfo.logerror.log 分别包含 ONLY 警告、信息和错误?

这是 log4j2.xml 实现:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="PID">%pid</Property>
        <Property name="LOG_DIRECTORY">/media/edoyou/HDD/Kanan/k2s-project/k2sbeauty/logs</Property>
        <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
        <Property name="LOG_LEVEL_PATTERN">%5p</Property>
        <Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
        <Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}}
            %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint}
            %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
        </Property>
        <Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t]
            %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
        </Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}"/>
        </Console>
        <RollingFile name="InfoFile" fileName="${LOG_DIRECTORY}/info.log"
                     filePattern="${LOG_DIRECTORY}/logs/info-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
            <Filters>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="DENY"/>
                </Filters>
        </RollingFile>
        <RollingFile name="ErrorFile" fileName="${LOG_DIRECTORY}/error.log"
                     filePattern="${LOG_DIRECTORY}/logs/error-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        <RollingFile name="WarnFile" fileName="${LOG_DIRECTORY}/warn.log"
                     filePattern="${LOG_DIRECTORY}/logs/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
            <Filters>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="DENY"/>
            </Filters>
        </RollingFile>

    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="InfoFile"/>
            <AppenderRef ref="WarnFile"/>
            <AppenderRef ref="ErrorFile"/>
        </Root>
    </Loggers>
</Configuration>

java spring spring-boot logging log4j
1个回答
2
投票

过滤器可以有三个结果:

  • ACCEPT
    - 接受消息,
  • DENY
    - 删除消息,
  • NEUTRAL
    - 继续到下一个过滤器。

在您的配置中:

<Filters>
    <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
    <ThresholdFilter level="warn" onMatch="DENY" onMismatch="DENY"/>
</Filters>

第一个过滤器接受至少与

INFO
一样具体的所有消息。第二个过滤器从未使用过。你想要的是:

<Filters>
    <ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="DENY"/>
    <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>

备注:从版本 2.13.0 开始,您可以使用

LevelMatchFilter
代替整个
<Filters>
组件:

<LevelMatchFilter level="INFO"/>

或者,您可以使用

RoutingAppender
来定义不带过滤器的单个附加程序,例如:

<Routing name="FILE">
  <Routes pattern="$${event:Level}">
    <Route>
      <RollingFile name="${event:Level}File"
                   fileName="${LOG_DIRECTORY}/${lower:${event:Level}}.log"
                   filePattern="${LOG_DIRECTORY}/logs/${lower:${event:Level}}-%d{yyyy-MM-dd}-%i.log.gz">
        <PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
        <SizeBasedTriggeringPolicy size="10 MB"/>
        <DefaultRolloverStrategy max="10"/>
      </RollingFile>
    </Route>
  </Routes>
</Routing>
© www.soinside.com 2019 - 2024. All rights reserved.