Как совместить logrotate с Log4j "свертывающим" файловым приложением?
У нас есть Java-приложение, которое использует log4j и ежедневно меняет свои логи:
- В настоящее время используется файл журнала
/var/log/foo/foo.log
- Это перемещено в
/var/log/foo/foo.log.YYYY-MM-dd
когда день меняется
Мы бы не хотели менять его конфигурацию...
Тем не менее, мы хотим:
- Сожмите файл, как только он был переименован
- Сохранить только определенное количество из них
Хотя было бы нетрудно написать cron-задачу для выполнения обоих задач, мы бы предпочли остаться в рамках logrotate
...
Я создаю следующее /etc/logrotate.d/foo
:
/var/log/foo/foo.log.* {
daily
rotate 2
compress
delaycompress
missingok
notifempty
}
но это ничего не делает
reading config file /etc/logrotate.d/foo
Handling 1 logs
rotating pattern: /var/log/foo/foo.log.* after 1 days (2 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/foo/foo.log.2017-06-28
log does not need rotating
considering log /var/log/foo/foo.log.2017-06-29
log does not need rotating
considering log /var/log/foo/foo.log.2017-06-30
log does not need rotating
considering log /var/log/foo/foo.log.2017-07-01
log does not need rotating
considering log /var/log/foo/foo.log.2017-07-02
log does not need rotating
considering log /var/log/foo/foo.log.2017-07-03
log does not need rotating
considering log /var/log/foo/foo.log.2017-07-04
log does not need rotating
Как заставить его сжать файлы и удалить самые старые, когда их общее количество превышает 2?
3 ответа
Мне нужно было выполнить это поведение, потому что команды приложения хотели сохранить контроль над журналом и форматом имени файла, а также графиком ротации с log4j. Если вы читаете man logrotate
вы заметите, что все сценарии pre / post / lastaction выполняются только при повороте хотя бы одного журнала. Таким образом, установка чего-то недостижимого, как size 999G
не работает.
Вместо этого я установил copy
а также extension
варианты так что:
- Исходный файл журнала никогда не трогался (им управляет log4j)
- Журналы, повернутые logrotate, имеют другое расширение, по которому я могу фильтровать
/var/log/<service>/<service>.log {
copy # don't touch the orig. log file, it's managed by log4j
extension .log # End rotated files in ".log" so we can find and delete them
rotate 1
hourly
missingok
prerotate
find /var/log/<service>/ -iname "*service.log.*" ! -iname "*.gz" -exec gzip {} \; && \
aws s3 sync /var/log/<service>/ s3://<bucket>/<environment>/<ec2_id>/<service>/ --exclude "*" --include "*<service>*.gz" && \
find /var/log/<service>/ -iname "*<service>.log.*" -mtime +7 -delete
endscript
lastaction
find /var/log/<service>/ -iname "*<service>.*.log" -delete
endscript
}
Да, я мог бы просто сделать работу cron. Мои аргументы в пользу использования logrotate
является то, что я держу все управление конфигурацией ротации журналов в одной роли Ansible, и в будущем я буду делать случай, чтобы отключить log4j
вращение и использование logrotate
вместо этого, который будет простым изменением.
Я действительно не думаю, что вы сможете делать то, что вы хотите с logrotate
без каких-либо внешних команд. Кроме того, шаблон /var/log/foo/foo.log.*
будет обрабатывать каждый отдельный файл, как если бы это был отдельный журнал, который нужно повернуть, а не как набор повернутых файлов.
man logrotate
Пожалуйста, используйте подстановочные знаки с осторожностью. Если вы укажете *, logrotate будет вращать все файлы, включая ранее повернутые.
Во всяком случае, может быть, что-то подобное? Просто установите условие поворота, которое никогда не будет достигнуто, так как log4j уже частично обрабатывает вращение. Затем положите остальные в prerotate
скрипт?
/var/log/foo/foo.log {
size 100G # something big that will never be reached/rotated since log4j does this.
missingok
notifempty
# delete the other logs over 7 days old
prerotate
find /var/log/foo/ -name 'foo.log.*' -mtime +7 -delete
nice gzip /var/log/foo/foo.log.*
endscript
}
Log4j Rolling File Appenders и logrotate не совместимы. Вращение log4j будет мешать logrotate.
Сначала вам нужно найти файл конфигурации log4j для приложения и заменить Rolling File Appenders на простые File Appenders. Это остановит log4j от вращения файлов. Затем вы можете использовать logrotate, чтобы вращать файлы журнала, как вы хотели.
Если вы не можете изменить конфигурацию log4j приложения, вы можете создать свою собственную и указать ее в пути к классам при просмотре приложения.
-Dlog4j.configurationFile=path/to/log4j2.xml