Logrotate가 작동하지 않습니다


18

내 아파치 파일을 매주 회전시키기 위해 VPS에서 logrotate를 사용하려고합니다. 현재 apache2 구성 파일의 내용은 이와 같습니다.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

나는 지금 2 주 동안 방치했는데 내가 말할 수있는 한 아무것도 변하지 않았다. 명령 줄에서 시뮬레이션하면 다음과 같은 결과가 나타납니다.

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

내가 잘못 구성한 것에 대한 아이디어가 있습니까?

내 상태 파일도 비어 있습니다 :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

최신 정보

상태 파일을 삭제하고 강제로 logrotate를 실행했으며 이제 로그가 회전 한 것처럼 보이고 상태 파일이 더 유망 해 보입니다!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf

답변:


17

나는 weeklylogrotate가 access.log 파일을 회전시키기 위해 적어도 일주일 전에 access.log 파일에 대한 항목을보고 싶어 한다는 것을 의미합니다.

따라서 문제는 회전을 트리거하기 위해 상태 항목을 저장하지 않는 것 같습니다.


여기서 A는 케이스의 간단한 예를 통해 강화된다 logrotate에 로그가 회전을 결정하는 방법
(이러한 우분투 페도 경로이다를 CentOS 등이 상이 할 수 있음)

(나는 http://localhostaccess_log에 몇 가지 항목을 요청 했지만 그렇지 않으면 logrotate는 결코 회전하지 않습니다 ...)

그래서 나는 아파치에 대한 logrotate를 매주 그렇게 설정했다.

/var/log/httpd/*log {
        weekly
...
}

원래 /var/lib/logrotate.status파일 에는 항목이 없습니다.

# grep access_log /var/lib/logrotate.status
<- nothing

따라서 logrotate는 access_log파일을 회전시키지 않습니다 .

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

그러나 logrotate를 수동으로 실행하면;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

이제 상태 파일에 httpd access_log에 대한 항목이 있습니다.

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

그러나 항목이 0 일 (2012-5-11)에 불과하기 때문에 아파치는 여전히 로그를 회전시키지 않습니다.

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

그러나 vi를 사용하여 상태 파일을 편집하면 vi /var/lib/logrotate.status날짜를 일주일 이상으로 설정할 수 있습니다.

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

그런 다음 2012-4-11오늘부터 일주일 이상 전에 상태 파일의 날짜로 인해 logrotate가 파일을 올바르게 회전시킵니다.2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(드라 이런은 드라 이런의 -d원인이므로 검사에만 유용하므로 -d상태를 입력하거나 파일을 회전 시키지 않고 실제로 명령을 실행해야합니다. )


1
로그 파일에는 1 주일이 지난 항목이있었습니다. 이제는 작동하는 것처럼 보이지만 지금부터 일주일을 알아낼 것 같습니다.
Malachi

2
죄송합니다. 답을 더 명확하게 알 수 있었지만 매주 회전하려면 /var/lib/logrotate.status적어도 일주일이 지난 날짜 의 파일에 항목이 필요하다고 생각합니다 . 예를 들어 대답을 업데이트했습니다.
Tom H

이러한 명확한 설명에 감사드립니다-날짜 측면에 대해 완전히 이해합니다. 명령을 수동으로 호출하지 않으면 회전하지 않습니다 .CRON이 로그 회전을 호출하지 않는 것과 같습니다.
말라기

나는 리눅스 관리에 비교적 익숙하지 않다 ... /etc/cron.daily/logrotate/ 안에 : #! / bin / sh test -x / usr / sbin / logrotate || 0 번 출구
말라 치

7
log does not need rotating

로그 파일이 비어 있기 때문일 수 있습니다.
이 상황은 아파치가 아파치를 다시 시작하지 않고 이름을 바꾼 이전 로그 파일에 여전히 기록하기 때문에 발생할 수 있습니다. 따라서 access.log는 access.log.1이되어 아파치가이를 기록합니다.

또는 로그 생성 시간에 문제가 있습니다.

ls -al --time=ctime /var/www/user/site.com/logs/

notifempty회전하지 않는 0 바이트 로그를 처리하기 위해 행을 주석 처리 할 수 있습니다 . 그런 다음 touch각 테스트 전에 새 로그 파일을 작성하여 logrotate에 회전시킬 것이 있습니다.
Banjer

6

이 답변 중 어느 것도 도움이되지 않았다는 것을 제외하고는 비슷한 문제에 직면했습니다. 로그 파일이 크고 오래되었고 구성이 100 % 정상이고 유효했기 때문에 상태 파일을 제거해도 도움이되지 않았습니다.

문제가 중복 logrotate 항목에 있음 이 밝혀졌습니다 . 구성 파일에서 logrotate를 수동으로 실행하면 다음과 같이됩니다.

logrotate -df /etc/logrotate.d/my_service_name

오류가 표시되지 않았습니다.

log does not need rotating

나는 아직도 왜 실제로는 모른다. 그러나 내가 완전한 logrotate 명령을 실행할 때 :

logrotate -f /etc/logrotate.conf

나는 다음 줄을 얻었다 :

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

내 서비스의 logrotate 구성 파일에는 서비스 로그 자체뿐만 아니라 nginx 액세스 로그를 회전시키는 항목이 포함되어 있습니다. 그리고 이는 모든 nginx 항목에 대한 규칙이있는 ngnix logrotate 구성과 충돌했습니다.

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

그래서 내 경우의 해결책은 매우 간단합니다. 내 구성에서 충돌하는 nginx 로그 회전 규칙삭제 해야했습니다 .

logrotate가 최신 버전 중 하나의 규칙 충돌에서만 처리 파일을 중단하기 시작했다고 가정합니다. v.3.8.7 에서이 오류가 발생하지만 동일한 충돌 구성으로 v.3.7.8에서 동일한 오류가 기록되지만 잘 회전합니다. logrotate changelog에서 해당 레코드를 찾을 수 없었습니다.


가장 최신 버전에 대한 것 같습니다. 또한 중복 된 항목이있었습니다. 그러나 logrotate를 수동으로 실행할 때; 잘 작동했습니다. 야간 반환 값 0; 그러나 제대로 실행되지 않았다 ...
Chris Maes

2

실행 해보십시오 sudo logrotate -f --verbose /etc/logrotate.d/apache2 콘솔에 작성된 내용을보고 잘못된 것을 수정하십시오.


0

시스템 업데이트 후 더 이상 메일 로그를 회전시키지 않은 데비안 7 머신이있었습니다. 메일 로그를 제외한 다른 모든 로그는 올바르게 회전되었습니다. 메일 로그가 몇 기가 바이트 증가한 것을 발견했습니다. 나는 항상 Webmin을 통해 로그 순환을 관리했습니다. 그런 다음 실행 logrotate -d /etc/logrotate.conf하면 다음 메시지가 나타납니다.

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

내 메일 로테이션 항목이에 나열되어 /etc/logrotate.d/rsyslog.dpkg-old있는데 무시되었습니다. 파일 이름을 바꾸면 로그 파일 회전이 수정되었습니다 :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.