如何使用log4j2只记录一个级别?

qq24tv8q  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(284)

我在我的应用程序中使用log4j 2。
我想要的是所有到“debug”的内容都转到控制台,所有到“info”的内容都转到myapp.log,只有“info”才能转到“myapp-audit.log”。
原因是,INFO主要由对数据的成功修改组成(例如,“用户已创建”、“用户已更新”、“用户已删除”等)。它实际上是数据修改的审核日志。
但我不知道该怎么做。
如何仅获取“info”以登录到“myapp-audit.log”?以下是我的当前配置...

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <File name="LogFile" fileName="myapp.log">
            <PatternLayout
                pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>

        <File name="AuditFile" fileName="myapp-audit.log">
            <PatternLayout
                pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </appenders>

    <loggers>
        <root level="debug">
            <appender-ref ref="Console" level="debug" />
            <appender-ref ref="LogFile" level="info" />
            <appender-ref ref="AuditFile" level="info" /> <!-- I want ONLY 'info' here -->
        </root>
    </loggers>
</configuration>
oo7oh9g9

oo7oh9g91#

如果在appender-ref中指定INFO,则appender将接收INFO、WARN、ERROR和FATAL事件。通过过滤掉WARN、ERROR和FATAL级别的事件,可以进一步限制为仅接收INFO:

<File name="AuditFile" fileName="myapp-audit.log">
    <PatternLayout 
       pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%nZ" />
    <Filters>

        <!-- First deny warn, error and fatal messages -->
        <ThresholdFilter level="warn"  onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL"/>

        <!-- Then accept info, warn, error, fatal and deny debug/trace -->
        <ThresholdFilter level="info"  onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
</File>
pod7payv

pod7payv2#

你不能直接这样做,因为info级别包含了“以上”的所有内容--警告、错误、致命。
在课程中:

Logger log = LogManager.getLogger("audit");

在xml:

<Logger name="audit" level="info">
   <Appender-ref ref="AuditFile" level="info" />
</Logger>

或者,您可以使用RoutingAppender(您可以使用ThreadContext以外的其他格式):

ThreadContext.put("ROUTINGFLAG", "audit");
log.info("...");
ThreadContext.remove("ROUTINGFLAG");

在xml:

...
    <Routing name="Routing">
        <Routes pattern="$${ctx:ROUTINGFLAG}">
            <Route AppenderRef="LogFile"/>              
            <Route AppenderRef="AuditFile" key="audit"/>                  
        </Routes>
    </Routing>
</Appenders>
<Loggers>
    <Root level="debug">
        <Appender-ref ref="Console" level="debug"/>
        <AppenderRef ref="Routing" level="info"/>
    </Root>
</Loggers>
9ceoxa92

9ceoxa923#

您可以使用LevelRangeFilter。它有minLevelmaxLevel属性(当然还有onMatch和onMismatch属性)。
例如(在json中)我们需要在控制台中只打印信息和警告级别的日志:

"Appenders": {
  "Console": {
    "PatternLayout": {
      "pattern": "%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n"
    },
    "name": "Console",
    "target": "SYSTEM_OUT",
    "LevelRangeFilter": {
      "minLevel": "warn",
      "maxLevel": "info",
      "onMatch": "ACCEPT",
      "onMismatch": "DENY"
    }
  }
}

如果你只想要信息级别,那么将“info”写入属性min和max。

dced5bon

dced5bon4#

补充Remko Popma的答案-您可以使用两个阈值过滤器拒绝任何高于和低于所需水平的内容。

<File name="AuditFile" fileName="myapp-audit.log">
    <PatternLayout pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%nZ" />
    <Filters>

        <!-- Deny anything above INFO level -->
        <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>

        <!-- Deny anything below INFO level -->
        <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>

    </Filters>
</File>

相关问题