วิธีการบีบอัดและล้างบันทึกด้วย logrotate แต่ไม่หมุน


10

ฉันมีเซิร์ฟเวอร์ Tomcat ซึ่งสร้างล็อกการเข้าถึงผ่านทางวาล์ว ( org.apache.catalina.valves.FastCommonAccessLogValve ) วาล์วนี้ดูแลการหมุนไฟล์บันทึกการเข้าถึง แต่ไม่บีบอัดหรือลบไฟล์หลังจากเวลาผ่านไปสักครู่

ในขณะนี้ฉันมีงาน cron ที่ใช้find [...] -mtime +30 [...]ในการบีบอัดและลบบันทึก ฉันอยากจะใช้ logrotate เพื่อให้การหมุนเวียนบันทึกอยู่ในที่ที่เป็นศูนย์กลางสำหรับบันทึกทั้งหมด ฉันไม่ชอบการแก้ปัญหาแยกเฉพาะสำหรับ Tomcat

ฉันพยายามอ่าน logrotate แต่ฉันก็ยังหลงทางอยู่ ฉันสามารถใช้ logrotate เพื่อบีบอัดและล้างไฟล์บันทึกได้หรือไม่? ฉันจะทำอย่างไร

หรือพลิกปัญหามี Tomcat access log valve ที่จะบีบอัดและล้างข้อมูลล็อกไฟล์หรือไม่?

ขอบคุณสำหรับความช่วยเหลือของคุณ!


BTW: FastCommonAccessLogValve เลิกใช้แล้วใน 6.0 tomcat.apache.org/tomcat-6.0-doc/api/org/org/apache/catalina/valves/ …
Janning

คำตอบ:


17

ค่อนข้างเรียบง่ายที่ฉันได้เห็นผลงานเช่นนี้

สร้างไฟล์ใน /etc/logrotate.d ชื่อ tomcat ที่มีสิ่งต่อไปนี้: -

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

วิ่งนี้ในชีวิตประจำวัน , การบีบอัด es ไฟล์และช่วยให้ 7 วันมูลค่า ( หมุน 7 ) copytruncateหมายความว่ามันจะคัดลอกแล้วตัดไฟล์ต้นฉบับเพื่อให้มีความจำเป็นที่จะต้องเริ่มต้นใหม่คราวไม่มี หายไปตกลงจะไม่เกิดข้อผิดพลาดหากไม่มี

Valve access.log สามารถเปลี่ยนเป็นไม่หมุนได้โดยเพิ่ม rotatable = false: -

<Valve className="org.apache.catalina.valves.AccessLogValve
     ...
     ...
     suffix="log" rotatable="false" />

1
ปัญหาของฉันคือไม่เหมือนกับ catalina.out ล็อกการเข้าถึงของฉันหมุนไปแล้ว
Guillaume

3
ตกลงสามารถปิดใช้งานการหมุนบันทึกการเข้าถึงได้โดยการตั้งค่า rotatable = false ในอาร์กิวเมนต์ Valve ตอบรับแล้วที่จะรวมสิ่งนี้
Decado

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 / ทุบตี
#
# TPP 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
DATE = `date --rfc-3339 = date`
YEAR = `date +% Y`

สำหรับ f ใน $ (ค้นหา catalina * | 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)
 ทำ
  ถ้า ["$ {ก่อนหน้า}}"! = ""]
  แล้วก็
    echo "bzip2 $ {ก่อนหน้า}}" 
    bzip2 $ ก่อนหน้า
  Fi
  ส่งออกก่อนหน้า = $ f
 เสร็จแล้ว
เสร็จแล้ว

ออก 0


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.