web-dev-qa-db-fra.com

log4j2 xml configuration - Journal dans un fichier et une console (avec différents niveaux)

Je veux faire deux choses:

  1. Se connecter à la console avec un certain niveau de journalisation
  2. Log to file avec un autre niveau de log

La journalisation de la console semble fonctionner correctement, mais le fichier journal reste vide.

C'est mon log4j2.xml

<?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="MyFile" fileName="logs/app.log" immediateFlush="true">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>  

  </appenders>
  <loggers>

    <logger name="filelogger" level="error">
        <appender-ref ref="MyFile"/>
    </logger>

    <root level="info">
      <appender-ref ref="Console"/>
    </root>
  </loggers>
</configuration>

Quel est le problème?

32
daker

Je l'ai compris! La balise <Logger> ne doit pas être utilisée dans ce cas, voir la réponse de Gaurang Patel pour plus de détails.

<?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="MyFile" fileName="logs/app.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="info"/>
      <appender-ref ref="MyFile" level="error"/>
    </root>    
  </loggers>
</configuration>
56
daker

Bien que Daker ait mis le fichier de configuration corrigé, il ne l’a pas expliqué. Je voudrais ajouter une explication ici. Comme indiqué dans la documentation Log4j2 ici , l'utilisation de la balise <Logger> n'était pas nécessaire pour l'exigence donnée. Plus loin quand vous devriez utiliser la balise <Logger>? Lisez ci-dessous les explications de la documentation,

Peut-être est-il souhaitable d'éliminer toute la sortie TRACE de tout sauf com.foo.Bar. Changer simplement le niveau de log ne serait pas accomplir la tâche. Au lieu de cela, la solution consiste à ajouter un nouvel enregistreur définition à la configuration:

<Loggers>
  <Logger name="com.foo.Bar" level="TRACE"/> 
  <Root level="ERROR">  
    <AppenderRef ref="STDOUT"> 
  </Root>
  ...
</Loggers>
16
Gaurang Patel

<logger name="filelogger" level="error" >
Cela devrait être le problème. Le nom du consignateur correspond généralement au nom de votre package (à moins que vous ne l’ayez spécifiquement nommé filelogger).
Essayez <logger name="com.yourpackage" level="error" additivity="true">

Référez-vous Log4j2 Doc

5
basiljames

J'utilise <ThresholdFilter /> et <AppenderRef level=""> pour le faire

  • Console : tout afficher
  • app.log :> = info, sauf erreur
  • error.log :> = erreur

VOIR 

  • <ThresholdFilter level = "error" onMatch = "DENY" onMismatch = "ACCEPT" />

  • <AppenderRef ref = "fileLogger" level = "info" />

<?xml version="1.0" encoding="UTF-8"?>      
<Configuration status="error" monitorInterval="5"> <!-- status:error mean ONLY show log4j kernel's error log in console-->
    <Properties>
        <Property name="APP_LOG_ROOT">Your log's path</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
        <RollingFile name="fileLogger" fileName="${APP_LOG_ROOT}/app.log" filePattern="${APP_LOG_ROOT}/app-%d{yyyy-MM-dd}.log">
            <!-- Except Error -->
            <ThresholdFilter level="error" onMatch="DENY" onMismatch="ACCEPT"/>
            <PatternLayout>
                <pattern>%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %level %logger{36} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
        <RollingFile name="errorLogger" fileName="${APP_LOG_ROOT}/error.log" filePattern="${APP_LOG_ROOT}/error-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %level %logger{36} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="trace" >
            <AppenderRef ref="Console" level="trace" />
            <AppenderRef ref="fileLogger" level="info" />
            <AppenderRef ref="errorLogger" level="error" />
        </Root>
    </Loggers>
</Configuration>
0
周宏成