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

Я сошел с ума, так как кажется, что ничего не работает для печати номеров строк. "nofollow">Миграция Log4j2, но результат тот же, что и выше. Если у кого-то есть какое-либо решение, пожалуйста, дайте мне знать.


person Anand j. Kadhi    schedule 20.08.2015    source источник
comment
используйте %L в своем шаблоне, он добавит номер строки в ваш журнал.   -  person Achyuth Kodali    schedule 03.04.2020


Ответы (3)


Здесь я нашел решение:: Log4j2 AsyncLogger с приложение для скользящего файла не показывает номер строки файла

Затем я изменил ссылку на приложение, чтобы она прямо указывала на имя RollingFile вместо <Async name>, теперь он правильно показывает номер строки. Не уверен, почему это происходит, я найду и скоро опубликую причину.

Поэтому изменил следующее::

<Logger name="com.memorynotfound.logging" level="debug"
            includeLocation="true">
            <AppenderRef ref="asyncApplication" />
        </Logger>

to

<Logger name="com.memorynotfound.logging" level="debug"
        includeLocation="true">
        <AppenderRef ref="application" />
    </Logger>
person Anand j. Kadhi    schedule 21.08.2015

Из соображений производительности асинхронный регистратор по умолчанию закрыл includeLocation. Если вы хотите напечатать номер строки и имя класса, вам нужно добавить <Async name="asyncFramework" includeLocation="true">

К вашему сведению https://logging.apache.org/log4j/2.x/manual/layouts.html#LocationInformation

person shawn    schedule 14.08.2018

В документе описывается причина, по которой не печатается номер строки. В нем говорится, что вы можете переопределить поведение по умолчанию в конфигурации вашего регистратора или асинхронного приложения, указав 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#LocationInformation

person sunshine    schedule 29.05.2019