wildfly и logrotate: wildfly все еще регистрирует сообщения в уже повернутом server.log

Для wildfly (в Linux) мне нужен следующий сценарий ведения журнала: ежедневная ротация server.log и удаление старых файлов журнала которые старше 90 дней. Я не вижу способа настроить это в wildfly / log4j (проблема здесь в том, чтобы удалить старые файлы журнала, но я буду рад советам, как сделать это напрямую с конфигурацией wildfly). Поэтому я Для этого необходимо использовать 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 дней? [127 8] Конфигурация журнала 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>
1
задан 4 April 2019 в 09:13
3 ответа

После ротации журналов вам необходимо сообщить 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 повторно открывал файлы журнала.

1
ответ дан 3 December 2019 в 23:06

Дело в том, что я не хочу перезапускать wildfly. Спасибо «никто» за ответ. Но теперь я знаю, что logrotate не подходит для моего случая.

Обходной путь заключается в использовании в wildfly "обработчика-файла-поворота-размера" (вместо "обработчика-файла"). Чтобы переключиться на обработчик изменения размера, мне нужно отредактировать standalone.xml , заменив раздел с:

<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 который также может удалять старые файлы журналов. Затем вы должны интегрировать ваш новый файловый аппендер в wildfly (wildfly должен найти файл класса, а конфигурация standalone.xml должна быть изменена так, чтобы wildfly использовался как новый файловый аппендер). Я думаю, это должно сработать. Однако для меня время, необходимое для этого, слишком велико ...

0
ответ дан 3 December 2019 в 23:06

Можно ли совмещать опции logrotate и JBOSS? Для автономного изменения конфигурации logging.properties:

logger.handlers=FILE
handler.log_rotation.suffix=-yyyyMMdd

И используйте logrotate только для файлов с - в имени файла:

/var/log/wildfly/capp/*.log-* {
0
ответ дан 27 May 2020 в 16:02

Теги

Похожие вопросы