2017-04-16 24 views
0

私は少し問題があり、解決策を見つけることができません。私はレベルの警告以外のレベル情報のパターンレイアウトを設定したい。ログイン情報レベルがINFOの場合はすべてOKですが、ログがレベルWARNの場合は、コンソールに2回書き込まれます(レベル情報とレベル警告として)。特定のレベルのすべてのログが、そのレベルおよびレベル以下でログに記録されます。Log4j2異なるレベルの異なるアペンダー

レベル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以上のレベルのログイベントを持ちたいが(FATAL、ERRORをWARN)「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がLevel ERRORで構成され、LogEventにLevel DEBUGが含まれる場合、ERRORイベントはDEBUGよりも具体的であるため、onMismatch値が返されます。

これにより、レベルがWARN未満のイベントのみを受け付けるようになります。

もう1つの解決策は、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> 

関連する問題