log4j – перенаправляем часть логов в отдельный файл

Written by elwood

Проблема

logo

В общий лог выводятся сообщения, которые видеть нежелательно. С другой стороны, полностью отключать логи для этого package не хочется. А в коде поправить возможности нет – библиотека сторонняя, и пишет в логи ошибки, которые по идее ошибками не являются. В моем случае это был jboss remoting, записывающий сообщение об отключении клиента в ERROR при отправке асинхронного push-уведомления.

Решение

Добавить в log4j.xml определение Appender, который будет писать эти логи в отдельный файл, и настроить категории логирования так, чтобы эти логи не шли в общий лог.

Appender:

<appender name="RemotingLogFile" class="org.jboss.logging.appender.DailyRollingFileAppender">
  <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
  <param name="File" value="${jboss.server.log.dir}/remoting.log"/>
  <param name="Append" value="true"/>
  <param name="DatePattern" value="'.'yyyy-MM-dd"/>
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n"/>
  </layout>
</appender>

Определения категорий:

<category name="org.jboss.remoting" additivity="false">
  <priority value="DEBUG"/>
  <appender-ref ref="RemotingLogFile"/>
</category>
 
<!-- для следующих двух классов установим loglevel повыше, в INFO -->
<category name="org.jboss.remoting.transport.socket.SocketClientInvoker" additivity="false">
   <priority value="INFO"/>
   <appender-ref ref="RemotingLogFile"/>
</category>
 
<category name="org.jboss.remoting.transport.bisocket.BisocketClientInvoker" additivity="false">
   <priority value="INFO"/>
   <appender-ref ref="RemotingLogFile"/>
</category>

Важно ! Если не указывать additivity=false, то эти категории будут записываться и в ROOT категорию тоже (правда, только те, которые соответствуют loglevel рутовой категории). И соответственно, будут попадать в общий лог по-прежнему. Чтобы этого избежать, нужно устанавливать additivity в true.

Результат

Основной лог не содержит сообщений из jboss remoting вообще, все логи, связанные с ним, идут в файл remoting.log. LogLevel для этой категории по умолчанию установлен в DEBUG, но для двух классов – INFO, поскольку в режиме DEBUG они чересчур многословны.