簡體   English   中英

如何用log4j2只記錄一個級別?

[英]how to log only one level with log4j2?

我在應用程序中使用log4j2。

我想要的是將要進行調試的所有內容都放入控制台,將要進行“信息”的所有內容都進入myapp.log,僅將“信息”的所有內容都進入“ myapp-audit.log”。

原因是,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>

如果在appender-ref中指定INFO,則附加程序將接收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>

您無法直接執行此操作,因為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>

您可以使用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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM