Изменения в категориях Log4j / эффект логгеров - PullRequest
0 голосов
/ 17 октября 2011

У меня проблема с log4j. Я использую configureAndWatch, чтобы log4j опрашивал следующий конфиг случайно и обновлял то, что ведется регистрация:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- Write logs to a file -->
    <appender name="DEBUGGING" class="org.apache.log4j.RollingFileAppender">
        ...
    </appender>

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        ...
    </appender>

    ...

    <category name="com.ourinternalpackage" additivity="false">
        <priority value="DEBUG"/>
        <appender-ref ref="CONSOLE"/>
    </category>

    <root>
        <level value="DEBUG"/>
        <appender-ref ref="CONSOLE"/>
    </root>

</log4j:configuration>

Это хорошо работает. Все, что я ожидаю, заканчивает тем, что вошло в консоль. Теперь я добавляю (перед корневым элементом):

    <category name="com.ourinternalpackage.somesubpackage.SomeClass" additivity="true">
        <priority value="DEBUG"/>
        <appender-ref ref="DEBUGGING"/>
    </category>

Теперь, как и ожидалось, сообщения журнала от SomeClass попадают в файл журнала ОТЛАДКИ и записываются на консоль. Большой! Однако, когда я изменяю приоритет категории с именем "com.ourinternalpackage.somesubpackage.SomeClass" на OFF, запись в CONSOLE также отключается. Это неожиданно, поскольку категория с именем «com.ourinternalpackage» по-прежнему имеет приоритет в DEBUG и ведет запись на консоль. Другие сообщения уровня отладки из классов в com.ourinternalpackage попадают в консольный журнал. Кроме того, если я удаляю категорию с appender-ref для DEBUGGING из файла конфигурации, он продолжает добавлять сообщения отладки в журнал.

Есть идеи, как можно включать и выключать вход в систему для определенной категории / регистратора без перезапуска приложения? В большинстве случаев уровень приоритета для категории с именем «com.ourinternalpackage» будет установлен на INFO. В этом случае я мог бы установить приоритет категории с именем «com.ourinternalpackage.somesubpackage.SomeClass» на INFO, чтобы уменьшить количество выполненных журналов, но я все равно буду вести журнал в обоих файлах. Чего бы я хотел избежать, если это возможно.

1 Ответ

1 голос
/ 17 октября 2011

Есть идеи, как можно включить и выключить вход и выход для определенной категории / регистратора без необходимости перезапуска приложения?

В предыдущем абзаце вы сказали, чточто вы уже сделали это, установив приоритет «OFF».

Если я вас правильно понимаю, то все, что вы описали, - это поведение log4j.Вам следует потратить некоторое время на log4j руководство , чтобы понять, как работают регистраторы и приложения.Вы, кажется, неправильно ожидаете, что один и тот же регистратор может быть настроен на два разных приоритета / уровня.Это не так, как это работает.Если у вас есть конкретные вопросы, кроме тех, которые я цитировал, задавайте их явно.

Обновление: На основании вашего обновления вам все равно необходимо прочитать руководство по log4j.(Это действительно короткий и легкий для чтения.) У вас есть Logger с именем "com.ourinternalpackage.somesubpackage.SomeClass".Есть только один из них, и независимо от того, указали ли вы его явно в файле конфигурации или нет, он существует, потому что где-то ваш код вызывает или заставляет вызываться Logger.getLogger(SomeClass.class).

Ваш единственный Logger может иметь только один приоритет.Когда вы определяете <category name="com.ourinternalpackage.somesubpackage.SomeClass" ..., его приоритет исходит оттуда, потому что он точно соответствует Logger.Если вы не определили точное соответствие, то ваш Logger наследует свой приоритет от ближайшего предка, который равен <category name="com.ourinternalpackage" ....Таким образом, когда вы добавляете точное совпадение и устанавливаете его в «ВЫКЛ», ожидаемое (и демонстрируемое) поведение приводит к отключению всех выходных данных этого регистратора.

Итак, все же ответ на ваш вопрос"Ты уже делаешь это."То есть вы уже включаете и выключаете вход в систему для определенного регистратора.Просто у вас неверное представление о том, что такое Logger.Вы думаете, что у вас есть два регистратора, когда у вас есть только один.Одним из возможных решений вашей проблемы было бы создание двух регистраторов.Тогда вы можете контролировать их индивидуально, как вы пытаетесь.Если вы создадите один файл с именем «com.ourinternalpackage.somesubpackage.SomeClass» и один с именем «debug.com.ourinternalpackage.somesubpackage.SomeClass», то вы создадите прецедент для префикса отладочных регистраторов с помощью «debug», и вы сможете контролировать своивесь набор отладочных регистраторов с одной записью конфигурации: <category name="debug" ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...