log4j2 xml configuration-вход в файл и консоль (с разными уровнями)
Я хочу сделать две вещи:
- войти в консоль с определенным уровнем журнала
- войти в файл с другим уровнем журнала
ведение журнала консоли работает нормально, но файл журнала продолжает оставаться пустым.
Это мой 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>
что может быть не так?
4 ответов
Я все понял! The <Logger>
тег не должен использоваться в этом случае, см. ответ Gaurang Пателя для деталей.
<?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>
хотя Дэйкер поместил исправленный файл конфигурации, но он не объяснил это. Здесь я хотел бы добавить пояснение. Как указано в документации Log4j2 здесь, использование тега
возможно, необходимо исключить все выходные данные трассировки из все кроме ком.foo.Бар. Простое изменение уровня журнала не выполнить задачу. Вместо этого решение заключается в добавлении нового регистратора определение конфигурации:
<Loggers>
<Logger name="com.foo.Bar" level="TRACE"/>
<Root level="ERROR">
<AppenderRef ref="STDOUT">
</Root>
...
</Loggers>
<logger name="filelogger" level="error" >
это должно быть проблема. Имя регистратора обычно является именем вашего пакета (если вы специально не назвали его filelogger
).
попробовать <logger name="com.yourpackage" level="error" additivity="true">
Refer Log4j2 Doc
Я использую <ThresholdFilter />
и <AppenderRef level="">
для этого
- консоль: вывод всех
- app.log: > = info, Кроме error
- ошибка.log: >= ошибка
посмотреть
<?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>