[server] logrotate를 사용하여 로그를 압축하고 정리하는 방법

밸브 ( org.apache.catalina.valves.FastCommonAccessLogValve ) 를 통해 액세스 로그를 생성하는 Tomcat 서버가 있습니다 . 이 밸브는 액세스 로그 파일의 회전을 처리하지만 일정 시간 후에 압축하거나 삭제하지는 않습니다.

현재 find [...] -mtime +30 [...]로그를 압축하고 삭제 하는 데 사용하는 크론 작업이 있습니다. logrotate를 사용하여 로그 회전이 모든 로그의 중앙 위치에 있도록합니다. Tomcat 전용 솔루션을 좋아하지 않습니다.

logrotate 설명서를 읽으려고했지만 여전히 약간 잃어 버렸습니다. logrotate를 사용하여 로그 파일을 압축하고 정리할 수 있습니까? 어떻게해야합니까?

또는 문제를 해결하려면 로그 파일을 압축하고 정리하는 Tomcat 액세스 로그 밸브가 있습니까?

도와 주셔서 감사합니다!



답변

내가 본 것은 매우 간단합니다.

/etc/logrotate.d에 다음을 포함하는 tomcat이라는 파일을 만듭니다.

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

이 런 일이 , 압축이 파일을 말이지, 7 일의 가치를 유지 ( 7 회전 ). copytruncate 는 Tomcat을 다시 시작할 필요가 없도록 원본 파일을 복사 한 다음 잘라냅니다. 확인 이 없으면 오류가 발생하지 않습니다.

rotatable = false :-를 추가하여 access.log 밸브를 회전하지 않도록 변경할 수 있습니다.

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


답변

수정 된 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


답변

Tomcat 구성을 변경하고 싶지 않아 회전 된 파일을 압축하는 스크립트를 만들었습니다.

#! / bin / bash
#
# TPP 2013-02-21
#
# Tomcat 앱은 다양한 로거 (대부분 log4j)를 사용합니다.
# 이것들은 유닉스 로그 회전 시스템 인 logrotate와 충돌하여 회전합니다.
#
# 일부 파일 예 : catalina.out
#는 날짜가 포함 된 백업으로 회전합니다 (예 : catalina.2013-01-06.log).
# bz2를 사용하여 catalina.2013-01-06.log.bz2로 압축 할 수 있습니다.
#

cd / var / log / tomcat6

# 2013-02-21
DATE =`날짜 --rfc-3339 = 날짜`
년 =`날짜 + % Y`

f에서 $ (catatalina * 찾기 | grep -v bz2 | grep -v '$ DATE'| grep $ YEAR)
하다
 에코 "bzip2 $ f"
 bzip2 $ f
끝난

# 그러나 다른 사람들은 날짜를 포함하는 동안 활동적입니다.
# 그래서 우리는 모든 것을 발견하고 가장 최근을 압축하지 않을 것입니다
'localhost *' 'opt-db *' 'opt *' 'host-manager *' 'manager *'에서 l
하다
 이전 내보내기 =
 f에서 $ (find $ l | grep -v bz2 | 정렬)
 하다
  if [ "$ {previous}"! = ""]
  그때
    에코 "bzip2 $ {previous}"
    bzip2 $ 이전
  fi
  이전 내보내기 = $ f
 끝난
끝난

출구 0


답변

놀랍도록 간단합니다. 구체적으로 회전하려는 파일을 logrotate에 알려주십시오. nocreate파일을 하위 폴더로 회전하는 경우 이전 파일을 이동 한 후 빈 파일을 다시 만들지 않도록 logrotate에 지시합니다.

/var/log/tomcat/catalina.out.* {
  daily
  nocreate
  compress
  missingok
}


답변

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


답변

여기에 간단한 솔루션이 제공되었습니다. s3 업로드 옵션도 포함됩니다.

https://yottabrain.org/tomcat/tomcat-log-backup/


답변