Подтвердить что ты не робот

Логротат файлов с датой в имени файла

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

После использования нашего друга 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 с помощью:

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 часов с поиском -mmin +1380 может быть более подходящим.

Ответ 2

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

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

Второй и более быстрый способ - использовать свой небольшой script для выполнения этой работы, используя 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 {} \; на что-то еще.

Ответ 3

Что-то вроде этого в файле /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 )

Ответ 4

/path/to/logs/*. log {     missingok     компресс     повернуть 7 }

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

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

Ответ 5

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

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

Ответ 6

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

Загрузите пакет 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 "[email protected]" 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 "[email protected]" 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

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

Ответ 7

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

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

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

Ответ 8

Ну, я не был полностью доволен ни одним из ответов, хотя те, которые заявили, что 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.

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