wildfly и logrotate: wildfly по-прежнему записывает сообщения на уже повернутый server.log
Для wildfly (на linux) мне нужен следующий сценарий регистрации: ежедневная ротация server.log
и удаление старых файлов журнала, которые старше 90 дней. Я не вижу способа настроить это в wildfly/log4j (проблема здесь в том, чтобы удалить старые файлы журнала, но я буду рад советам сделать это напрямую с настройкой wildfly). Поэтому я должен использовать Linux Linux Logrotate для этого. У меня есть следующий файл конфигурации logrotate:
/var/log/wildfly/capp/*.log {
missingok
daily
notifempty
rotate 90
maxage 90
dateext
dateformat -%Y%m%d
}
server.log
будет успешно повернут ранним утром. Но: wildfly все еще записывает сообщения журнала в уже зарегистрированный файл (см. Метки времени последнего доступа к записи):
#> ls -la
-rw-r--r-- 1 wildfly-capp wildfly-capp 0 4. Apr 03:40 server.log
-rw-r--r-- 1 wildfly-capp wildfly-capp 368909 4. Apr 07:00 server.log-20190404
Есть ли способ заставить Wildfly использовать server.log
файл вместо уже повернутого файла (без перезапуска wildfly)? Или же можно изменить конфигурацию ведения журнала wildfly, чтобы удалить файлы журнала, которые старше x
дней?
Конфигурация регистрации wildfly:
<subsystem xmlns="urn:jboss:domain:logging:5.0">
<console-handler name="CONSOLE">
<level name="INFO"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
<file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<append value="true"/>
</file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.jboss.as.config">
<level name="DEBUG"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<formatter name="PATTERN">
<pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
<formatter name="COLOR-PATTERN">
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
</subsystem>
2 ответа
После того, как вы вращаете журналы, вы должны сообщить wildfly, что журналы вращаются и что они должны начать запись в новый файл журнала. Обычно это делается с помощью сигнала HUP, отправляемого демону, или вы можете просто перезапустить его. В противном случае, демон сохранит дескриптор открытого файла и запишет в старый файл. Это делается путем добавления секции postrotate, рассказывающей о том, что нужно сделать после ротации логов. Взгляните на примеры для postrotate в файле конфигурации logrotate. Вот несколько примеров с моего компьютера для ufw и samba:
postrotate
invoke-rc.d rsyslog rotate >/dev/null 2>&1 || true
endscript
postrotate
if [ -d /run/systemd/system ] && command systemctl >/dev/null 2>&1 && systemctl is-active --quiet samba-ad-dc; then
systemctl kill --kill-who all --signal=SIGHUP samba-ad-dc
elif [ -f /var/run/samba/samba.pid ]; then
# This only sends to main pid, See #803924
kill -HUP `cat /var/run/samba/samba.pid`
fi
endscript
Для wildfly вам нужно будет написать свою собственную команду (и), чтобы wildfly повторно открывал файлы журналов.
Дело в том, что я не хочу перезапускать Wildfly. Спасибо "никому" за ответ. Но теперь я знаю, что logrotate не подходит для моего случая.
Обходной путь - использовать "размер-вращающий-обработчик файла" (вместо "обработчик-файл") в wildfly. Чтобы переключиться на размер, вращающийся обработчик, я должен отредактировать standalone.xml
и замена <file-handler name="FILE" autoflush="true">
раздел <subsystem xmlns="urn:jboss:domain:logging:5.0">
с:
<size-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<append value="true"/>
<rotate-size value="1M"/>
<max-backup-index value="10"/>
</size-rotating-file-handler>
Это будет вращать server.log
файл после файла журнала больше 1 МБ и будет хранить только 10 файлов резервной копии журнала. Все старые файлы журнала будут удалены.
Я думаю, что если вы хотите иметь ежедневник рендеринга, который удаляет файлы журналов старше чем x
дни, вы должны написать собственный DailyRotateFileAppender
который также может удалить старые файлы журнала. Затем вы должны интегрировать свой новый файловый appender в wildfly (wildfly должен найти файл класса и standalone.xml
Конфигурация должна быть изменена так, чтобы wildfly будет использовать новый файл appender). Я думаю, что это должно работать. Однако для меня время, необходимое для этого, слишком велико...
Можно ли комбинировать опции logrotate и JBOSS? Для автономного изменения конфигурации
logging.properties
:
logger.handlers=FILE
handler.log_rotation.suffix=-yyyyMMdd
И используйте logrotate только для файлов с
-
в имени файла:
/var/log/wildfly/capp/*.log-* {