2017-04-16 71 views
0

我有一個小問題,找不到解決方案。我想爲級別信息設置模式佈局,而不是級別警告。如果我有一個登錄級別INFO,那麼一切正常,但是如果日誌級別爲WARN,它將被寫入控制檯兩次(如級別信息和級別警告)。只需在特定級別的所有日誌寫出我們在該級別和以下級別的日誌。Log4j2不同水平的不同appender

我想登錄級別INFO寫出如控制檯:"%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"和級別WARN"%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="INFO"> 
    <Appenders>   
     <Console name="ConsoleInfo" target="SYSTEM_OUT"> 
      <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> 
      <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/> 
     </Console>  
     <Console name="ConsoleWarning" target="SYSTEM_OUT"> 
      <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/> 
      <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/> 
     </Console> 
     <File name="File" fileName="logs/cli.log"> 
      <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/> 
     </File> 
    </Appenders> 

    <Loggers> 
     <Root level="ALL"> 
      <AppenderRef ref="ConsoleInfo"/> 
      <AppenderRef ref="ConsoleWarning"/> 
      <AppenderRef ref="File"/>  
     </Root> 
    </Loggers> 
</Configuration> 

回答

0

據我瞭解,你想有日誌事件與水平WARN或更高(WARN,ERROR,FATAL)轉到「ConsoleWarning」附加器只,而不是將兩者「ConsoleWarning」和「ConsoleInfo 」。

這樣做會修改你的「ConsoleInfo」附加器過濾器配置的最簡單的方法,基本做到這樣了相反的做法:

<Console name="ConsoleInfo" target="SYSTEM_OUT"> 
    <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/> 
    <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/> 
</Console> 

這工作,因爲作爲log4j2 manual states

如果LogEvent中的級別與相同,或者比配置的級別和onMismatch值相同,則此過濾器將返回onMatch結果。例如,如果ThresholdFilter配置了ERROR級別,並且LogEvent包含級別DEBUG,則會返回onMismatch值,因爲ERROR事件比DEBUG更具體。

這將導致appender僅接受級別低於WARN的事件。

另一種可能的解決方案是使用RoutingAppender指定每個級別的目的地。如果你這樣做,那麼你根本不需要ThresholdFilters。還要注意,您可以通過不提供默認路由並且不爲該級別提供路由來忽略特定級別的事件。例如,如果從下面的配置中刪除<Route ref="ConsoleInfo" key="DEBUG" />,則路由附加程序將忽略所有的DEBUG事件,並且不會將其打印到控制檯。這裏是配置:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="INFO"> 
    <Appenders>   
     <Console name="ConsoleInfo" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/> 
     </Console>  
     <Console name="ConsoleWarning" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/> 
     </Console> 
     <File name="File" fileName="logs/cli.log"> 
      <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/> 
     </File> 
     <Routing name="Routing"> 
      <Routes> 
       <Script name="RoutingInit" language="JavaScript"><![CDATA[ 
        logEvent.getLevel();]]> 
       </Script> 
       <Route ref="ConsoleInfo" key="TRACE" /> 
       <Route ref="ConsoleInfo" key="DEBUG" /> 
       <Route ref="ConsoleInfo" key="INFO" /> 
       <Route ref="ConsoleWarning" key="WARN" /> 
       <Route ref="ConsoleWarning" key="ERROR" /> 
       <Route ref="ConsoleWarning" key="FATAL" /> 
      </Routes> 
     </Routing> 
    </Appenders> 

    <Loggers> 
     <Root level="ALL"> 
      <AppenderRef ref="Routing"/> 
      <AppenderRef ref="File"/>  
     </Root> 
    </Loggers> 
</Configuration> 

希望這有助於!