log4j2 de configuration xml - Log fichier et de la console (avec différents niveaux)
je veux faire deux choses:
- se Connecter à la console avec un certain log-level
- Log fichier avec un autre log-level
journalisation de la Console semble fonctionner très bien, mais le fichier journal garde étant 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>
Ce qui ne va pas?
4 réponses
j'ai tout compris! <Logger>
l'étiquette ne devrait 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>
bien que Daker ait mis le fichier de configuration corrigé mais il ne l'a pas expliqué. Je voudrais ajouter explication ici. Comme indiqué dans la Documentation de Log4j2 ici, l'utilisation de la balise
peut-être est-il souhaitable d'éliminer toute TRACE de tout sauf com.foo.Bar. Changer simplement le niveau de log pas accomplir la tâche. Au lieu de cela, la solution est d'ajouter un nouveau logger définition de la configuration:
<Loggers>
<Logger name="com.foo.Bar" level="TRACE"/>
<Root level="ERROR">
<AppenderRef ref="STDOUT">
</Root>
...
</Loggers>
<logger name="filelogger" level="error" >
Cela devrait être le problème. Le nom de l'enregistreur est habituellement le nom de votre paquet (à moins que vous ne l'ayez spécifiquement nommé filelogger
).<logger name="com.yourpackage" level="error" additivity="true">
Consulter Log4j2 Doc
j'utilise <ThresholdFilter />
et <AppenderRef level="">
pour ce faire
- Console sortie:
- app.journal: >= info, sauf erreur
- erreur.journal: >= erreur
voir
<?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>