Как сжимать и чистить логи с помощью logrotate, но не вращать их

10

У меня есть сервер Tomcat, который создает журналы доступа через клапан ( org.apache.catalina.valves.FastCommonAccessLogValve ). Этот клапан заботится о вращении файла журнала доступа, но не о сжатии или удалении их через некоторое время.

На данный момент у меня есть задание cron, которое использует find [...] -mtime +30 [...]для сжатия и удаления журналов. Я бы предпочел использовать logrotate, чтобы ротация журналов была централизованной для всех журналов. Мне не нравится иметь отдельное решение только для Tomcat.

Я пытался прочитать документацию logrotate, но я все еще немного потерян. Могу ли я использовать logrotate только для сжатия и очистки файлов журнала? Как бы я это сделал?

Или, решая проблему, существует ли клапан доступа Tomcat, который сжимает и очищает файлы журнала?

Спасибо за помощь !

Гийом
источник
КСТАТИ: FastCommonAccessLogValve устарела в 6.0 tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/…
Январь

Ответы:

17

Довольно простой, который я видел, работает следующим образом.

Создайте файл в /etc/logrotate.d с именем tomcat, содержащий следующее: -

/var/log/tomcat/catalina.out { 
  copytruncate 
  daily 
  rotate 7 
  compress 
  missingok 
}

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

Клапан access.log можно изменить, чтобы он не вращался, добавив rotatable = false: -

<Valve className="org.apache.catalina.valves.AccessLogValve
     ...
     ...
     suffix="log" rotatable="false" />
Decado
источник
1
Моя проблема в том, что в отличие от catalina.out, мой журнал доступа уже повернут.
Гийом
3
Хорошо, вращение журнала доступа можно отключить, установив rotatable = false в аргументах Valve. Обращался, чтобы включить это.
Декадо
2

Модифицированный скрипт TimP - добавлено удаление очень старых файлов, добавлено сканирование старых сжатых файлов.

#!/bin/bash
#
# TPP 2013-02-21
# RJK 2014-08-14
#
# Tomcat apps use a variety of loggers, mostly log4j.
# These rotate, conflicting with logrotate, the unix log rotation system.
#
# Some files eg catalina.out
# are rotated to a backup containing a date eg catalina.2013-01-06.log
# which can then be compressed with bz2 to catalina.2013-01-06.log.bz2
# or removed if older than a given number of days(MTIME).
#
cd /var/log/tomcat6
# 2013-02-21
DATE=`date --rfc-3339=date`
YEAR=`date +%Y`
MILLENIUM=20
# 2014-08-14
MTIME=14
# 2014-08-14
#for f in $(find catalina* |grep -v bz2 |grep -v '$DATE' |grep $YEAR)
for f in $(find catalina* |grep -v bz2 |grep -v '$DATE' |grep $MILLENIUM)
do
 # 2014-08-14
 if test `find $f -mtime +$MTIME`
 then
   echo "rm -f $f"
   rm -f $f
 else
   echo "bzip2 $f"
   bzip2 $f
 fi
done
# However others are active whilst containing a date
# so we will find all and not compress the most recent
for l in 'localhost*' 'opt-db*' 'opt*' 'host-manager*' 'manager*'
do
 export previous=
 for f in $(find $l |grep -v bz2 |sort)
 do
  if [ "${previous}" != "" ]
  then
    echo "bzip2 ${previous}"
    bzip2 $previous
  fi
  export previous=$f
 done
done
# 2014-08-14
for f in $(find *bz2)
do
 if test `find $f -mtime +$MTIME`
 then
   echo "rm -f $f"
   rm -f $f
 fi
done
exit 0 
Рич К.
источник
1

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

#! / Bin / Баш
#
№ ТЭС 2013-02-21
#
# Приложения Tomcat используют различные регистраторы, в основном log4j.
# Они вращаются, что противоречит logrotate, системе ротации журналов Unix. 
#
# Некоторые файлы, например, catalina.out
# повернуты в резервную копию, содержащую дату, например, catalina.2013-01-06.log
# который затем можно сжать с помощью bz2 до catalina.2013-01-06.log.bz2
#

cd / var / log / tomcat6

# 2013-02-21
ДАТА = `дата --rfc-3339 = дата`
ГОД = `дата +% Y`

для f в $ (найти каталину * | grep -v bz2 | grep -v '$ DATE' | grep $ YEAR)
делать
 echo "bzip2 $ f" 
 bzip2 $ f
сделанный

# Однако другие активны, хотя и содержат дату
# так мы найдем все и не сжимаем самые последние
для l в 'localhost *' 'opt-db *' 'opt *' 'host-manager *' 'manager *'
делать
 экспортировать предыдущий =
 для f в $ (найти $ l | grep -v bz2 | sort)
 делать
  if ["$ {previous}"! = ""]
  затем
    echo "bzip2 $ {предыдущий}" 
    bzip2 $ предыдущий
  фи
  экспортировать предыдущий = $ f
 сделанный
сделанный

выход 0

Timp
источник
1

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

/var/log/tomcat/catalina.out.* { 
  daily 
  nocreate
  compress 
  missingok 
}
Эндрю Лориен
источник
0

Для сжатия local_access_log.YYYY-MM-DD.txt я написал этот скрипт, увидев этот пост: -

#!/bin/bash
#
# If Tomcat uses server.xml config to rotate localhost_access_log,
# the daily rotated logs will need compressing and old ones deleted to stop filling
# the log partiton. Cannot use the system logrotate command as conficts with tomcat rotate
# therefore run this script in a daily cronjob
#
# localhost_access_log.2015-09-03.txt
#
# Add this script in /etc/cron.daily/ owned by root
#

CATALINA_BASE=`ps aux | grep catalina.base | awk -F'catalina.base\=' '{print $2}' | awk '{print $1}'`

if [ ! $CATALINA_BASE ]
then
    if [ -r /var/lib/tomcat8 ]
    then
        CATALINA_BASE=/var/lib/tomcat8
    else
        echo "Error: cannot find CATALINA_BASE"
        exit 1
    fi
fi

cd ${CATALINA_BASE}/logs

if [ $? -ne 0 ]
then
    echo "Error, cannot cd to logs directory, quitting...."
    exit 1
fi

# today's date (not to be gzipped)
DATE=`date --rfc-3339=date`
# number of days to keep
MTIME=28

# Compress all previous days uncompressed logs
for log in `ls localhost_access_log* | grep -v bz2 | grep -v $DATE`
do
    bzip2 $log
done

# delete old logs
find . -name "*.bz2" -mtime +$MTIME -exec rm {} \;

exit 0
Джон Купер
источник