Cara mengompresi dan membersihkan log dengan logrotate tetapi tidak memutarnya

10

Saya memiliki server Tomcat yang membuat log akses melalui katup ( org.apache.catalina.valves.FastCommonAccessLogValve ). Katup ini menangani pemindahan file log akses, tetapi tidak memampatkan atau menghapusnya setelah beberapa waktu.

Untuk saat ini, saya memiliki tugas cron yang digunakan find [...] -mtime +30 [...]untuk mengompresi dan menghapus log. Saya lebih suka menggunakan logrotate, sehingga rotasi log berada di tempat terpusat untuk semua log. Saya tidak suka memiliki solusi terpisah hanya untuk Tomcat.

Saya mencoba membaca dokumentasi logrotate, tetapi saya masih agak bingung. Bisakah saya menggunakan logrotate hanya untuk kompres dan pembersihan file log? Bagaimana saya melakukannya?

Atau membalikkan masalah, apakah ada katup akses log Tomcat yang akan mengompres dan membersihkan file log?

Terima kasih atas bantuanmu !

Guillaume
sumber
BTW: FastCommonAccessLogValve sudah ditinggalkan dalam 6,0 tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/...
Janning

Jawaban:

17

Cukup sederhana yang pernah saya lihat bekerja seperti ini.

Buat file di /etc/logrotate.d disebut tomcat yang berisi yang berikut: -

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

Ini berjalan setiap hari , kompres file, dan simpan selama 7 hari ( putar 7 ). copytruncate berarti bahwa itu akan menyalin kemudian memotong file asli sehingga tidak perlu me-restart kucing jantan. hilang ok tidak akan kesalahan jika tidak ada.

Access.log Valve dapat diubah menjadi tidak memutar dengan menambahkan rotatable = false: -

<Valve className="org.apache.catalina.valves.AccessLogValve
     ...
     ...
     suffix="log" rotatable="false" />
Decado
sumber
1
Masalah saya adalah tidak seperti catalina.out, log akses saya sudah diputar.
Guillaume
3
Oke, rotasi log akses dapat dinonaktifkan dengan mengatur rotatable = false dalam argumen Valve. Dijawab untuk memasukkan ini.
Decado
2

Skrip TimP yang dimodifikasi - Ditambahkan menghapus file yang sangat lama, menambahkan pemindaian untuk file terkompresi yang lama.

#!/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 
Rich K.
sumber
1

Saya tidak ingin mengubah konfigurasi Tomcat, jadi buat skrip yang mengkompres file yang diputar

#! / bin / bash
#
# TPP 2013-02-21
#
# Aplikasi Tomcat menggunakan berbagai penebang, kebanyakan log4j.
# Ini memutar, bertentangan dengan logrotate, sistem rotasi log unix. 
#
# Beberapa file misalnya catalina.out
# diputar ke cadangan yang berisi tanggal misalnya catalina.2013-01-06.log
# yang kemudian dapat dikompres dengan bz2 ke catalina.2013-01-06.log.bz2
#

cd / var / log / tomcat6

# 2013-02-21
DATE = `date --rfc-3339 = date`
YEAR = `date +% Y`

untuk f dalam $ (temukan catalina * | grep -v bz2 | grep -v '$ DATE' | grep $ TAHUN)
melakukan
 gema "bzip2 $ f" 
 bzip2 $ f
selesai

# Namun yang lain aktif saat mengandung tanggal
jadi kita akan menemukan semua dan tidak memampatkan yang terbaru
untuk l di 'localhost *' 'opt-db *' 'opt *' 'host-manager *' 'manager *'
melakukan
 ekspor sebelumnya =
 untuk f dalam $ (temukan $ l | grep -v bz2 | sort)
 melakukan
  jika ["$ {sebelumnya}"! = ""]
  kemudian
    echo "bzip2 $ {sebelumnya}" 
    bzip2 $ sebelumnya
  fi
  ekspor sebelumnya = $ f
 selesai
selesai

keluar 0

TimP
sumber
1

Sangat sederhana. Beri tahu logrotate file mana yang ingin Anda putar secara spesifik. nocreatememberitahu logrotate untuk tidak membuat ulang file kosong setelah memindahkan yang lama (jika Anda memutar file menjadi subfolder).

/var/log/tomcat/catalina.out.* { 
  daily 
  nocreate
  compress 
  missingok 
}
andrew lorien
sumber
0

Untuk kompresi local_access_log.YYYY-MM-DD.txt saya menulis skrip ini setelah melihat posting ini: -

#!/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
John Cooper
sumber