log4j – перенаправляем часть логов в отдельный файл
Проблема
В общий лог выводятся сообщения, которые видеть нежелательно. С другой стороны, полностью отключать логи для этого 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 они чересчур многословны.
0