Logrotate файлы с датой в имени файла - PullRequest
29 голосов
/ 22 января 2012

Я пытаюсь настроить logrotate в RHEL для журналов tomcat6. В настоящее время logrotate отлично работает для журнала catalina.out, он вращается и сжимается правильно.

Проблема с файлами с датой в них:

catalina.2012-01-20.log
catalina.2012-01-21.log
catalina.2012-01-22.log

Эти файлы не вращаются. Я понимаю, что мне нужно настроить их в файле /etc/logrotate.d/tomcat6, где настроено вращение для catalina.out. Но я не могу его настроить.

Все, что мне нужно, - это сжатие старых файлов ежедневно, кроме файла журнала текущей даты.

Может кто-нибудь помочь мне в этом, пожалуйста!

Спасибо Номан А.

Ответы [ 10 ]

37 голосов
/ 16 апреля 2014

(первое сообщение, так что если оно выглядит как пьяный паук, отформатировавшее его, то извините)

После использования нашего друга Google, здесь и я не могу вспомнить, где еще мне удалось чего-то добиться с помощью logrotate (а не cron или какого-либо другого эквивалента).

У меня есть следующее в / var / log / rsync /:

-rw-r--r-- 1 root root 1.1M Apr  9 08:13 2014-04-09 07:48:18.log
-rw-r--r-- 1 root root 1.4M Apr 11 15:20 2014-04-11 15:02:52.log
-rw-r--r-- 1 root root 1.6M Apr 11 15:42 2014-04-11 15:22:04.log
-rw-r--r-- 1 root root 1.8M Apr 12 08:01 2014-04-12 07:45:31.log
-rw-r--r-- 1 root root 2.0M Apr 13 08:10 2014-04-13 07:53:38.log
-rw-r--r-- 1 root root 2.2M Apr 14 08:19 2014-04-14 07:51:09.log
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log

и следующий файл logrotate:

/var/log/rsync/*.log {
       daily
       rotate 7
       compress
       delaycompress
       notifempty
       missingok
}

что я считал вполне разумным. Но после того, как он отказался работать и, узнав, что он никогда не сработает (из-за этого поста), я подумал, можно ли его обмануть, чтобы заставить его работать.

После долгих испытаний и доработок мне удалось выдумать это следующим образом:

/var/log/rsync/dummy {
        daily
        rotate 0
        create
        ifempty
        lastaction
                /usr/bin/find /var/log/rsync/ -mtime +7 -delete
                /usr/bin/find /var/log/rsync/ -mtime +1 -exec gzip -q {} \;
        endscript
}

в конфигурационный файл logrotate с именем /etc/logrotate.d/local-rsync. Затем создайте фиктивный файл журнала:

touch /var/log/rsync/dummy

затем принудительно войдите в систему с помощью:

logrotate -fv /etc/logrotate.d/local-rsync

, что дает:

-rw-r--r-- 1 root root  71K Apr  9 08:13 2014-04-09 07:48:18.log.gz
-rw-r--r-- 1 root root  88K Apr 11 15:20 2014-04-11 15:02:52.log.gz
-rw-r--r-- 1 root root  82K Apr 11 15:42 2014-04-11 15:22:04.log.gz
-rw-r--r-- 1 root root  84K Apr 12 08:01 2014-04-12 07:45:31.log.gz
-rw-r--r-- 1 root root  87K Apr 13 08:10 2014-04-13 07:53:38.log.gz
-rw-r--r-- 1 root root  92K Apr 14 08:19 2014-04-14 07:51:09.log.gz
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log
-rw-r--r-- 1 root root    0 Apr 16 12:11 dummy

А теперь подожди до завтрашнего утра ...

Я понимаю, что cron будет более аккуратным, однако у меня есть другой элемент в файле конфигурации logrotate, и я хотел сохранить их вместе.

Бонус с фиктивным файлом в том, что он не занимает места!

Вы можете обнаружить, что он, кажется, ничего не вращал за один день. Мне потребовалось некоторое время, чтобы понять, почему, но потом все перевернулось. find -mtime +1 - целые дни (т. е. 24 * 60 минут), и если ежедневный логотат срабатывает менее чем через 24 часа с момента последнего времени / времени создания журналов, то иногда кажется, что он не работал. Если вас это беспокоит, то лучше использовать 23 часа с find -mmin +1380.

11 голосов
/ 15 марта 2012

Я потратил довольно много времени, читая много документации.Похоже, что Logrotate не может сгруппировать различные файлы с датами, указанными в имени файла.Logrotate не может делать то, что нам нужно.

У вас есть два варианта, чтобы изменить средство ведения журнала, предоставляемое java / tomcat, чтобы оно не включало дату в имя файла.http://tomcat.apache.org/tomcat-6.0-doc/logging.html

Второй и более быстрый способ - использовать собственный маленький скрипт, чтобы выполнить всю работу за вас, используя find.https://serverfault.com/questions/256218/logrotation-when-filenames-includes-date, https://serverfault.com/a/256231/71120

find / pathtologs / * -mtime +5 -exec rm {} \;

Я выбрал второй вариант,потому что наши разработчики закодировали даты в именах файлов.Так что нужно оставаться таким.Наборы -mtime +5 позволяют искать только файлы старше 5 дней.

Из документации find.

Данные файла были изменены в последний раз n * 24 часа назад.См. Комментарии к -atime, чтобы понять, как округление влияет на интерпретацию времени изменения файла.

Обновлено в соответствии с комментарием

find / pathtologs /* -mtime +5 -delete

Если вы специально хотите удалить, это быстрый способ сделать это.Если вам нужна какая-то другая команда, вы всегда можете заменить exec rm {} \; чем-то другим.

5 голосов
/ 25 марта 2014

Примерно так в /etc/cron.d/rotate_tomcat_logs:

# delete every log file over 100 days old, and compress every log file over 1 day old.
00 1 * * * root ( find /opt/tomcat/logs -name \*log\* -name \*.gz -mtime +100 -exec rm -f {} \; >/dev/null 2>&1 )
05 1 * * * root ( find /opt/tomcat/logs -name \*log\* ! -name \*.gz -mtime +1 -exec gzip {} \; >/dev/null 2>&1 )
2 голосов
/ 02 июля 2018

Кроме того, вы можете добавить кроны вместо жесткого кода logrotate.

1 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +30 -delete
2 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +1 -exec gzip -q {} \;

Таким образом, вы будете удалять журналы старше 30 дней и архивировать журналы старше 1.

2 голосов
/ 31 мая 2018

Чтобы включить дату в повернутый файл, вы, вероятно, можете использовать опцию dateext.

$ cat logrotate.conf 
/var/nginx/logs/access.log {
    size 10k
    copytruncate
    dateext
    rotate 10
    compress
}

Повернутый файл должен быть создан, как показано ниже

 root@nitpc:~# ls -lrt /var/nginx/logs/access.*
-rw-r--r-- 1 nginx root 5422 May 31 08:26 access.log
-rw-r--r-- 1 nginx root  466 May 31 08:26 access.log-20180531.gz

Единственным недостатком является то, что вы не сможете запускать его более одного раза в день, поскольку файл будет иметь определенное имя на эту дату.

Приведенный выше пример взят из моего док-контейнера Nginx, запущенного в k8s на GC. Версия logrotate - 3.11.0.

Надеюсь, это поможет!

Обновление: Из справочных страниц https://linux.die.net/man/8/logrotate

формат даты строка формата

Укажите расширение для dateext, используя нотацию, аналогичную функции strftime (3). Допускаются только спецификаторы% Y% m% d и% s. Значение по умолчанию -% Y% m% d. Обратите внимание, что символ, отделяющий имя журнала от расширения, является частью строки dateformat. Для правильной работы% s системные часы должны быть установлены после 9 сентября 2001 года. Обратите внимание, что метки даты, сгенерированные этим форматом, должны быть лексически сортируемыми (то есть сначала год, затем месяц, а затем день. Например, 2001/12/01 в порядке, но 01/12/2001 нет, поскольку 01/11 / 2002 год будет отсортирован ниже, а потом). Это связано с тем, что при использовании параметра rotate logrotate сортирует все повернутые имена файлов, чтобы выяснить, какие файлы журналов старше и должны быть удалены.

2 голосов
/ 02 апреля 2013

/ path / to / logs / *. Log {missingok compress rotate 7}

этот тип вещей не работает нормально, потому что, как отмечают другие, tomcat имеет свое собственное вращение журнала.Вы можете либо использовать простой cron для удаления старых файлов, либо отключить вращение на вентиле журнала доступа.Отключив ротацию логов (и, возможно, изменив шаблон имени файла), вышеприведенный logrotate и другие подобные настройки будут работать нормально.

Суть в том, что вы должны использовать logrotate или встроенную ротацию логов в tomcat, но не обав то же время.

1 голос
/ 14 декабря 2017

Ну, я не был полностью удовлетворен ни одним из ответов, хотя те, которые заявляют, что logrotate не поддерживает это (то есть только для удаления файлов, повернутых каким-либо другим приложением ), сценарий безусловно, верны (возможно, запросить функцию для этого инструмента?).

Итак, я хотел бы поделиться альтернативным подходом, к которому я пришел. В отличие от решения "find /path/to/logs -mtime +7 -delete", это не удалит все старые журналы по истечении указанного периода времени . Итак, вот он, пример однострочной команды bash, которая оставляет только N последних журналов на диске ( при каждом запуске ):

for f in `ls -1r | grep -E "^catalina\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.log$" | tail -n +$((N+1))`; do rm $f; done

Наконец, чтобы полностью охватить тему, последнее альтернативное решение - не вращать файлы журналов (например, использовать rotatable=false в случае Tomcat - см. Его документы) и использовать logrotate как обычно, но не забудьте использовать его с опцией copytruncate .

Предложения приветствуются ...

1 голос
/ 25 июля 2012

Возможно, вы можете удалить дату из имен файлов журнала, как описано в Как удалить шаблон даты из журналов tomcat , чтобы можно было использовать правила logrotate.

Это сработало для меня, по крайней мере, для журнала доступа localhost.

0 голосов
/ 08 апреля 2016

Чтобы включить ротацию ежедневного журнала в tomcat [linux] с постфиксом даты в файл catalina, внесите следующие изменения.

Загрузите пакет cronolog и установите его в linux os

wget http://pkgs.fedoraproject.org/repo/pkgs/cronolog/cronolog-1.6.2.tar.gz/md5/a44564fd5a5b061a5691b9a837d04979/cronolog-1.6.2.tar.gz

tar -zxvf cronolog-1.6.2.tar.gz
./configure
make
make install 

Откройте файл apache-tomcat-7.0.65 / bin / catalina.sh с помощью команды vi и измените строки, как показано в примере ниже: /opt/apache-tomcat-7.0.65/bin/catalina.sh

shift
touch "$CATALINA_OUT"
# comment above line as below 
#touch "$CATALINA_OUT"
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
  echo "Using Security Manager"
fi
shift
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
  -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
  -Djava.security.manager \
  -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  org.apache.catalina.startup.Bootstrap "$@" start \
  #>> "$CATALINA_OUT" 2>&1 "&"
  # comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
else
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
  -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  org.apache.catalina.startup.Bootstrap "$@" start \
  #>> "$CATALINA_OUT" 2>&1 "&"         
  # comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
fi

После вышеуказанных изменений сохраните файл и перезапустите кота, чтобы применить изменения.

0 голосов
/ 22 января 2012

В вашем файле ротации журналов используйте rotate #, где # - количество журналов, которое вы хотите сохранить перед их удалением.

число поворотов

Файлы журналов вращаютсяраз перед удалением или отправкой по почте на адрес, указанный в почтовой директиве.Если число равно 0, старые версии удаляются, а не поворачиваются.

...