log4j2 DynamicThresholdFilter не принимает значение свойства - PullRequest
0 голосов
/ 22 января 2019

Попытка установить разные уровни печати для консоли и файла.

Цель: когда debug = true , выведите уровень отладки (консоль и файл), иначе выведите только уровень ошибки (консоль).

Измените программно как это:

 @Override
   public void contextInitialized(ServletContextEvent sce) {
       ThreadContext.put("debugMode", "true");
   }

Это моя конфигурация log4j2:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
   <Properties>
       <Property name="logPath">${sys:catalina.home}</Property>
       <Property name="rollingFileName">vsTenant</Property>
   </Properties>

   <Appenders>                                   
       <Console name="console" target="SYSTEM_OUT">  
           <filters>>   
                <DynamicThresholdFilter key="debugMode" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL">
                   <KeyValuePair key="true" value="DEBUG"/>    
                   <KeyValuePair key="false" value="ERROR"/>       
               </DynamicThresholdFilter>              
           </filters>                         
           <PatternLayout pattern="%d{HH:mm:ss.SSS} [%thread] %-5level [vsTenant] %logger{36} - %msg\n%n" />
       </Console>                

       <RollingFile name="rollingFile" fileName="${logPath}/logs/vsTenant.log" filePattern="${logPath}/logs/vsTenant_%d{dd-MM-yyyy}.log">            
          <filters>>   
                <DynamicThresholdFilter key="debugMode" onMatch="ACCEPT" onMismatch="DENY">
                   <KeyValuePair key="true" value="DEBUG"/>                      
               </DynamicThresholdFilter>              
           </filters>               
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%thread] %-5level [vsTenant] %logger{36} - %msg\n%n" />
           <Policies>               
               <SizeBasedTriggeringPolicy size="50 MB" />              
           </Policies>            
           <DefaultRolloverStrategy max="5"/>            
       </RollingFile>       
   </Appenders>

   <Loggers>
       <Root level="ERROR" additivity="false">
           <AppenderRef ref="console" /> 
           <AppenderRef ref="rollingFile" />
       </Root>
   </Loggers>
</Configuration>

Всегда печатается уровень ОШИБКИ. Помощь приветствуется.

1 Ответ

0 голосов
/ 23 января 2019

Вы были близки, нужно всего несколько небольших изменений, чтобы добиться того, что вы хотите.

  1. Изменить первое onMismatch с NEUTRAL на DENY
  2. Добавить второй KeyValuePair ко второму фильтру: <KeyValuePair key="false" value="OFF"/>
  3. Изменить уровень записи Root с ERROR на TRACE

Вот модифицированная конфигурация:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
   <Properties>
       <Property name="logPath">${sys:catalina.home}</Property>
       <Property name="rollingFileName">vsTenant</Property>
   </Properties>

   <Appenders>                                   
       <Console name="console" target="SYSTEM_OUT">  
           <filters>
                <DynamicThresholdFilter key="debugMode" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="DENY">
                   <KeyValuePair key="true" value="DEBUG"/>    
                   <KeyValuePair key="false" value="ERROR"/>       
               </DynamicThresholdFilter>              
           </filters>                         
           <PatternLayout pattern="%d{HH:mm:ss.SSS} [%thread] %-5level [vsTenant] %logger{36} - %msg\n%n" />
       </Console>                

       <RollingFile name="rollingFile" fileName="${logPath}/logs/vsTenant.log" filePattern="${logPath}/logs/vsTenant_%d{dd-MM-yyyy}.log">            
          <filters> 
                <DynamicThresholdFilter key="debugMode" onMatch="ACCEPT" onMismatch="DENY">
                   <KeyValuePair key="true" value="DEBUG"/> 
                   <KeyValuePair key="false" value="OFF"/>                    
               </DynamicThresholdFilter>              
           </filters>               
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%thread] %-5level [vsTenant] %logger{36} - %msg\n%n" />
           <Policies>               
               <SizeBasedTriggeringPolicy size="50 MB" />              
           </Policies>            
           <DefaultRolloverStrategy max="5"/>            
       </RollingFile>       
   </Appenders>

   <Loggers>
       <Root level="TRACE" additivity="false">
           <AppenderRef ref="console" /> 
           <AppenderRef ref="rollingFile" />
       </Root>
   </Loggers>
</Configuration>

Вот некоторый Java-код для проверки:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();   

    public static void main(String[] args){
        ThreadContext.put("debugMode", "false");
        log.info("Info should not show anywhere");
        log.debug("This shouldn't show anywhere");

        ThreadContext.put("debugMode", "true");
        log.debug("This should show in the log and console");
        log.info("This should also show in both");

        ThreadContext.put("debugMode", "false");
        log.info("This should not show anywhere");
        log.error("This error should show only in console.");
    }
}

Выполнение вышеизложенного выведет на консоль следующее:

21:16:40.716 [main] DEBUG [vsTenant] example.SomeClass - This should show in the log and console

21:16:40.718 [main] INFO  [vsTenant] example.SomeClass - This should also show in both

21:16:40.718 [main] ERROR [vsTenant] example.SomeClass - This error should show only in console.

и выведите следующее в файл журнала:

21:16:40.716 [main] DEBUG [vsTenant] example.SomeClass - This should show in the log and console

21:16:40.718 [main] INFO  [vsTenant] example.SomeClass - This should also show in both
...