Настройка RollingFileAppender в log4j
Я работаю над набором веб-сервисов, и мы хотели бы иметь ежедневный ротационный журнал.
Я пытаюсь получить org.apache.log4j.rolling.RollingFileAppender
со стороны помощника по работе с log4j, так как в документации это лучше всего подходит для производственных сред.
У меня есть как основная библиотека log4J (log4j-1.2.15.jar
), так и библиотека дополнительных библиотек log4j (apache-log4j-extras-1.1.jar
) в пути к классам.
У меня есть следующая конфигурация для appender в файле log4j.properties
:
### SOAP Request Appender
log4j.appender.request=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.request.File=SOAPmessages.log
log4j.appender.request.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.request.RollingPolicy.ActiveFileName =SOAPmessages-%d.log
log4j.appender.request.RollingPolicy.FileNamePattern=SOAPmessages-%d.log.zip
log4j.appender.request.layout = org.apache.log4j.PatternLayout
log4j.appender.request.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
Однако, когда я запускаю веб-службу с log4j в режиме отладки, я получаю следующие сообщения об ошибках:
log4j: Parsing appender named "request".
log4j: Parsing layout options for "request".
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n].
log4j: End of parsing for "request".
log4j: Setting property [file] to [/logs/SOAPmessages.log].
log4j:WARN Failed to set property [rollingPolicy] to value "org.apache.log4j.rolling.TimeBasedRollingPolicy".
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'request'
log4j: Parsed "request" options.
Я нашел документацию о том, как настроить этот appender немного редкими, поэтому может кто-нибудь помочь мне исправить мою конфигурацию?
EDIT0: Добавлен вывод режима отладки, а не только стандартные предупреждения
Ответы
Ответ 1
В соответствии с Log4jXmlFormat вы не можете настроить его с помощью log4j.properties, но только с использованием формата конфигурации XML:
Обратите внимание, что TimeBasedRollingPolicy можно настроить только с помощью xml, а не log4j.properties
К сожалению, пример log4j.xml, который они предоставляют, также не работает:
log4j:ERROR Parsing error on line 14 and column 76
log4j:ERROR Element type "rollingPolicy" must be declared.
...
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'FILE'
Ответ 2
У меня была аналогичная проблема, и я нашел способ ее решить (путем однократного перехода через log4j-extras
источник, не менее...)
Хорошей новостью является то, что, в отличие от того, что написано повсюду, оказывается, что вы на самом деле МОЖЕТ конфигурировать TimeBasedRollingPolicy, используя log4j.properties(конфигурация XML не нужна! По крайней мере, в версиях log4j > 1.2.16 этот отчет об ошибке)
Вот пример:
log4j.appender.File = org.apache.log4j.rolling.RollingFileAppender
log4j.appender.File.rollingPolicy = org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.File.rollingPolicy.FileNamePattern = logs/worker-${instanceId}.%d{yyyyMMdd-HHmm}.log
Кстати, бит ${instanceId}
- это то, что я использую на Amazon EC2, чтобы отличать журналы от всех моих работников - мне просто нужно установить это свойство перед вызовом PropertyConfigurator.configure()
, как показано ниже:
p.setProperty("instanceId", EC2Util.getMyInstanceId());
PropertyConfigurator.configure(p);
Ответ 3
Столкнулся с большим количеством проблем при выполнении этой работы. Вот подробности:
- Чтобы загрузить и добавить
apache-log4j-extras-1.1.jar
в путь к классам, сначала не заметили этого.
-
RollingFileAppender
должен быть org.apache.log4j.rolling.RollingFileAppender
вместо org.apache.log4j.RollingFileAppender
. Это может привести к ошибке: log4j:ERROR No output stream or file set for the appender named [file].
- Нам пришлось обновить библиотеку log4j от
log4j-1.2.14.jar
до log4j-1.2.16.jar
.
Ниже приведена конфигурация appender, которая работала для меня:
<appender name="file" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="threshold" value="debug" />
<rollingPolicy name="file"
class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="logs/MyLog-%d{yyyy-MM-dd-HH-mm}.log.gz" />
<!-- The below param will keep the live update file in a different location-->
<!-- param name="ActiveFileName" value="current/MyLog.log" /-->
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
</layout>
</appender>
Ответ 4
Toolbear74 является правильным log4j.XML не требуется.
Чтобы заставить XML проверять теги <param>
, нужно быть ДО <rollingPolicy>
Я предлагаю установить порог регистрации <param name="threshold" value="info"/>
При создании файла Log4j.xml не забудьте скопировать log4j.dtd в ту же папку.
Вот пример:
<?xml version="1.0" encoding="windows-1252"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<!-- Daily Rolling File Appender that compresses old files -->
<appender name="file" class="org.apache.log4j.rolling.RollingFileAppender" >
<param name="threshold" value="info"/>
<rollingPolicy name="file"
class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern"
value="${catalina.base}/logs/myapp.log.%d{yyyy-MM-dd}.gz"/>
<param name="ActiveFileName" value="${catalina.base}/logs/myapp.log"/>
</rollingPolicy>
<layout class="org.apache.log4j.EnhancedPatternLayout" >
<param name="ConversionPattern"
value="%d{ISO8601} %-5p - %-26.26c{1} - %m%n" />
</layout>
</appender>
<root>
<priority value="debug"></priority>
<appender-ref ref="file" />
</root>
</log4j:configuration>
Учитывая, что ваши настройки a FileNamePattern
и ActiveFileName
, я считаю, что установка свойства File
избыточна и, возможно, даже ошибочна
Попробуйте переименовать ваши log4j.properties и сбросьте файл log4j.xml, похожий на мой пример, и посмотрите, что произойдет.
Ответ 5
Относительно ошибки: log4j:ERROR Element type "rollingPolicy" must be declared
- Используйте версию log4j.jar новее, чем log4j-1.2.14.jar, которая имеет
log4j.dtd
, определяющий rollingPolicy
.
- конечно, вам также понадобится
apache-log4j-extras-1.1.jar
- Проверьте, есть ли какие-либо другие сторонние банки, которые вы используете, возможно, имеют более раннюю версию log4j.jar, упакованную внутри.
Если это так, убедитесь, что ваш log4j.jar находится на первом месте в очереди перед третьей стороной, содержащей более старый log4j.jar.
Ответ 6
В Log4j2 библиотека "extras" больше не является обязательной. Также изменился формат конфигурации.
Пример приведен в документации Apache
property.filename = /foo/bar/test.log
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /foo/bar/rolling/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
logger.rolling.name = com.example.my.class
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
Ответ 7
Я подозрительно отношусь к свойству ActiveFileName
. Согласно log4j javadoc, в классе TimeBasedRollingPolicy
не существует такого свойства. (Нет setActiveFileName
или getActiveFileName
).
Я не знаю, что бы указало неизвестное свойство, но возможно, что это приведет к тому, что содержащий объект будет оставлен, и это может привести к предупреждениям, которые вы видели.
Попробуйте оставить его и посмотреть, что произойдет.
Ответ 8
У вас плохое имя пакета
org.apache.log4j.rolling.RollingFileAppender
Правильный вариант:
org.apache.log4j.RollingFileAppender