RollingFile Appender Log4j2 не печатает номер строки
Я использую log4j2 со следующей зависимостью::
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0-rc1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0-rc1</version>
</dependency>
Я использую следующую конфигурацию:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="LOGGER_HOME">/logs</Property>
</Properties>
<Appenders>
<RollingFile name="application" fileName="${LOGGER_HOME}/application.log"
filePattern="${LOGGER_HOME}/application.%d{yyyy-MM-dd}_%i.log">
<PatternLayout pattern="%d{ISO8601}{GMT} %-5p %C{2} (%F:%L) - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="1 GB" />
</Policies>
</RollingFile>
<RollingFile name="framework" fileName="${LOGGER_HOME}/em-logs/framework.log"
filePattern="${LOGGER_HOME}/framework.%d{yyyy-MM-dd}_%i.log">
<PatternLayout pattern="%d{ISO8601}{GMT} %-5p %C{2} (%F:%L) - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="1 GB" />
</Policies>
</RollingFile>
<Console name="out" target="SYSTEM_OUT">
<PatternLayout pattern="%d{ISO8601}{GMT} %-5p %C{2} (%F:%L) - %m%n" />
</Console>
<Async name="asyncApplication">
<AppenderRef ref="application" />
</Async>
<Async name="asyncFramework">
<AppenderRef ref="framework" />
</Async>
</Appenders>
<Loggers>
<Logger name="com.memorynotfound.logging" level="debug"
includeLocation="true">
<AppenderRef ref="asyncApplication" />
</Logger>
<Root level="debug" includeLocation="true">
<AppenderRef ref="asyncApplication"></AppenderRef>
</Root>
<Logger name="org.axonframework" level="info" additivity="false"
includeLocation="true">
<AppenderRef ref="asyncFramework" />
</Logger>
<Root level="error" includeLocation="true">
<AppenderRef ref="out" />
</Root>
</Loggers>
</Configuration>
Однако я получаю журналы на консоли в следующем формате
2015-08-20 14:29:41,613 DEBUG logging.LoggerExample (LoggerExample.java:11) - This will be printed on debug
И в файле Rolling я получаю следующий шаблон, где отсутствует номер строки:
2015-08-20 14:29:41,613 DEBUG ? () - This will be printed on debug
Я сошел с ума, так как, кажется, ничего не работает для печати номеров строк, я также перешел по официальной ссылке log4j2 Log4j2 Migration, но результат все тот же, что и выше. Если у кого-то есть решение, пожалуйста, дайте мне знать.
2 ответа
Здесь я нашел решение:: Log4j2 AsyncLogger с приложением прокрутки файла не показывает номер строки файла
Затем я изменил ссылку на приложение, указав имя RollingFile вместо <Async name>
, теперь он правильно показывает номер строки. Не уверен, почему это происходит, я найду и скоро опубликую причину.
Так изменилось следующее:
<Logger name="com.memorynotfound.logging" level="debug"
includeLocation="true">
<AppenderRef ref="asyncApplication" />
</Logger>
в
<Logger name="com.memorynotfound.logging" level="debug"
includeLocation="true">
<AppenderRef ref="application" />
</Logger>
Для оценки производительности асинхронный регистратор по умолчанию закрыл includeLocation. Если вы хотите напечатать номер строки и имя класса, вам нужно добавить <Async name="asyncFramework" includeLocation="true">
К вашему сведению https://logging.apache.org/log4j/2.x/manual/layouts.html
В документе описывается причина, по которой не печатается номер строки. Это говорит о том, что вы можете переопределить поведение по умолчанию в вашей конфигурации регистратора или асинхронного приложения, указав includeLocation="true"
, Но я не решил проблему, которая не печатала номер строки после того, как я это сделал. Возможно, потому что я не понял, что это значит, я сделал не то место.
Мое решение добавить %L
в шаблоне Log4j2 PatternLayout. Мой Log4j2.xml выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_HOME">./logs</Property>
</Properties>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n" />
</Console>
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/pinche_quartz.log"
filePattern="${LOG_HOME}/test.log-%d{yyyy-MM-dd}.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${LOG_HOME}/error/pinche_quartz-error.log"
filePattern="${LOG_HOME}/error/pinche_quartz-error.log-%d{yyyy-MM-dd}.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileError"/>
</root>
</Loggers>
</Configuration>
Я надеюсь помочь вам.
Документ Log4j2 https://logging.apache.org/log4j/2.x/manual/layouts.html