로그를 회전 할 때 아파치 다시로드를 피하는 방법은 무엇입니까?


25

logrotate를 사용하여 Apache 액세스, 오류 및 다시 쓰기 로그를 회전시킵니다. 내 구성 파일은 다음과 같습니다.

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

내 문제는 회전이 발생할 때마다 Apache가 방금 회전 된 로그 파일에 더 이상 쓰지 않기 때문에 Apache를 다시로드해야한다는 것입니다. logrotate가 회전 할 때마다 Apache 다시로드를 피하는 방법이 있습니까?

답변:


42

아파치에 다시로드가 필요한 이유는 파일을 열면 파일 핸들을 가져 와서 해당 파일 핸들에 계속 쓰기 때문입니다. 파일을 이동하면 동일한 핸들에 계속 쓰지 않습니다. 다시로드하면 파일이 다시 열리고 새 핸들이 생깁니다.

재로드를 피하기 위해 파일을 이동하는 대신 파일을 복사하고 이전 파일을 비울 수 있습니다. 그렇게하면 아파치는 같은 파일 핸들에 계속 쓸 수 있습니다. "rottruncate"옵션을 logrotate 설정 파일에 다음과 같이 추가하면됩니다 :

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}

답변 주셔서 감사합니다. lastaction echo "" | /apache/*log endscript파일 핸들을 추가 할 때 "잃어버린"것이 아니라고 생각합니다 .
하프

3
죄송합니다. "copy"대신 "copytruncate"라고 말해야합니다. 그런 다음 마지막 작업이 전혀 필요하지 않습니다. 나는 내 카페인 스트림에서 너무 많은 혈액을 가지고 있다고 비난합니다 :-)
Jenny D

매력처럼 작동 :)
하프

4
@harp은주의해야한다 logrotate. "파일 복사와 잘라 내기 사이에 시간 분할이 매우 적으므로 일부 로깅 데이터가 손실 될 수 있습니다."
Totor

일부 데이터가 손실 될 수있는 가능성 외에, 다른 알려진 단점이 copytruncate있습니까?
Leo Galleguillos

5

http://cronolog.org/ 를 사용하는 것이 좋습니다 .

이것이 내가 사용하는 방법입니다.

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined

1
웹 서버에 트래픽이 많은 경우 외부 프로그램으로 파이프하는 것이 문제가 될 수 있습니다. 그러나 파일 핸들 문제를 깔끔하게 피할 수 있습니다.
Jenny D

좋은 대안처럼 보입니다. cronolog는 즉석에서 압축합니까?
하프

apache2-utils 패키지에는 비슷한 앱 "rotatelogs"가 있습니다. 다른 아파치 가상 서버에서 동일한 로그 파일로 "파이프"하지 않도록주의하십시오.
Arie Skliarouk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.