Log4j: файл журнала правильный, но Stdout показывает только подмножество - PullRequest
2 голосов
/ 25 мая 2011

У меня проблема с настройкой моей регистрации в log4j. Все сообщения журнала отображаются, как и ожидалось, в файле root.log, но стандартный вывод показывает только подмножество root.log, хотя я настроил его так же.

РЕДАКТИРОВАТЬ: Точно я пропускаю все сообщения от a.b .

РЕДАКТИРОВАТЬ 2: Я не совсем уверен, но я думаю, что некоторые сообщения от a.b. (INFO и DEBUG) войти на стандартный вывод, другие нет. Может ли это быть проблема, связанная с потоками? Например. некоторые потоки делают запись, некоторые нет?

Вот мой log4j.xml, есть ли ошибка?

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} [%t] (%C:%L) %-5p - %m%n" />
        </layout>
    </appender>

    <appender name="FILE_ALL" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${catalina.home}/logs/root.log"/>
        <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%d [%t] %-4r (%F:%L) %-5p %x - %m%n" />
        </layout>
    </appender>

    <logger name="a.b.master">
        <level value="DEBUG" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_ALL" />
    </logger>

    <logger name="a.b.master.orm.support.HibernateSessionFilter">
        <level value="INFO" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_ALL" />
    </logger>

    <logger name="a.b.master.aop.hibernate.OpenSessionInRequestInterceptor">
        <level value="info" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_ALL" />
    </logger>

    <root>
        <level value="INFO"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_ALL"/>
    </root>
</log4j:configuration>

Я использую Commons Logging в качестве реализации.

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Я нашел решение, даже если не проблема напрямую. Я добавил параметр в свой ConsoleAppender, чтобы все выводилось на stderr. Это сейчас работает. Я предполагаю, что это проблема eclipse или log4j, потому что, если я запускаю приложение из терминала (консоли), я могу правильно видеть все сообщения журнала.

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.err" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-4r (%F:%L) %-5p %x - %m%n" />
        </layout>
    </appender> 
1 голос
/ 25 мая 2011

Ваша конфигурация очень похожа на мою, где мои журналы сбрасываются в консоль и на некоторый удаленный хост. Попробуйте, чтобы увидеть, работает ли он для вас: -

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        ...
    </appender>

    <appender name="FILE_ALL" class="org.apache.log4j.RollingFileAppender">
        ...
    </appender>

    <logger name="a.b.master">
        <level value="debug" />
    </logger>

    <logger name="a.b.master.orm.support.HibernateSessionFilter">
        <level value="info" />
    </logger>

    <logger name="a.b.master.aop.hibernate.OpenSessionInRequestInterceptor">
        <level value="info" />
    </logger>

    <root>
        <priority value="info"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_ALL"/>
    </root>
</log4j:configuration>

Я не думаю, что вам нужно определять appender-ref в каждом логгере a.b, так как он должен забирать appender из root. Также я использую priority вместо logger для root. В противном случае ваша конфигурация будет идентична моей, и я смогу правильно работать. Если по какой-то причине у вас это не работает, я бы посоветовал вам удалить из конфигурации свои пользовательские логгеры a.b, чтобы посмотреть, сможете ли вы получить сообщения a.b в вашей консоли.

Кроме того, просто к вашему сведению, я уверен, что вы уже знаете это, но если ваш корень настроен на использование «info», тогда на самом деле нет нужды также устанавливать свой собственный регистратор a.b в «info». Я обычно оставляю свой корень, чтобы «предупредить», и мои собственные регистраторы могут переопределить это с помощью «отладки» или «информации».

...