디렉토리 및 해당 서브 디렉토리에서 파일을 로테이션


62

logrotate디렉토리 및 모든 서브 디렉토리에서 로그 파일을 고려할 수 있습니까? (즉, 하위 디렉토리를 명시 적으로 나열하지 않은 경우)

답변:


87

하위 디렉토리는 얼마나 깊습니까?

/var/log/basedir/*.log /var/log/basedir/*/*.log {
    daily
    rotate 5
}

모든 회전합니다 .LOG 기본 디렉토리에있는 파일 /뿐만 아니라 모든 .LOG 기본 디렉토리의 직접적인 하위의 파일을. 1 단계 더 깊이 가야 /var/log/basedir/*/*/*.log하는 경우 각 레벨을 다룰 때까지 다른 레벨을 추가하십시오 .

이는 충족되지 않는 제약 조건이 포함 된 별도의 logrotate 구성 파일을 사용하여 테스트 할 수 있으며 (최소 크기) 로그를 실행하면 상세 모드로 회전합니다.

logrotate -d testconfig.conf

-d 플래그는 회전하려고하는 각 로그 파일을 나열합니다.


6
감사! -d실제로 logrotate를 드라이 런 모드로 전환하는 것처럼 보입니다 (즉, 실제로 아무것도 변경하지 않음).
ithinkihaveacat

1
직접적으로 관련이 없지만 다른 사람에게 유용 할 것입니다. 이 -f옵션은 logrotate에게 "force run"을 지시합니다. 명령 끝의 기본 단어는 기본값 대신 사용할 구성 파일입니다. 따라서 logrotate -f /some/config구성 파일을 사용하여 실행해야하며 구성 파일에 아직 실행 시간이 없다고 표시 되어도 항상 실행됩니다. 훈련받지 않은 눈과 cron 작업을 한 전임자에게는 -f구성 파일을 지정하는 것처럼 보였습니다 . 상당히 혼란 스럽습니다.
Dan Pritts

4

필자의 경우 하위 디렉토리의 깊이는 경고없이 변경 될 수 있으므로 모든 하위 디렉토리를 찾고 각 디렉토리에 대한 구성 항목을 작성하는 bash 스크립트를 설정했습니다.

와일드 카드 (예 : @ DanR 's answer)가 수행하지 않은 회전 후 하위 디렉토리의 구조를 유지하는 것도 중요합니다. 매일 로그 순환을 수행하는 경우이 스크립트를 매일 크론 작업에 넣을 수 있습니다.

basedir=/var/log/basedir/
#destdir=${basedir} # if you want rotated files in the same directories
destdir=/var/log/archivedir/ #if you want rotated files somewhere else
config_file=/wherever/you/keep/it
> ${config_file} #clear existing config_file contents

subfolders = $(find ${basedir} -type d)

for ii in ${subfolders}
do
    jj=${ii:${#basedir}} #strip off basedir, jj is the relative path

    #append new entry to config_file
    echo "${basedir}${jj}/* {
        olddir ${destdir}${jj}/
        daily
        rotate 5
    }" >> ${config_file}

    #add one line as spacing between entries
    echo "\n" >> ${config_file}

    #create destination folder, if it doesn't exist
    [ -d ${destdir}${jj} ] || mkdir ${destdir}${jj}
done

@ DanR이 제안한 것처럼 logrotate -d


1

오래된 스레드이지만 다음을 수행 할 수 있습니다.

/var/log/basedir/**/*.log {
    daily
    rotate 5
}

이 두 별은 0 개 이상의 디렉토리와 일치합니다. 그러나 이미 회전 된 파일을 회전 할 수 있으므로 회전 할 로그 파일을 정의하는 방법에주의해야합니다. 여기서 logrotate 매뉴얼을 인용하겠습니다.

와일드 카드는주의해서 사용하십시오. *를 지정하면 logrotate는 이전에 회전 한 파일을 포함하여 모든 파일을 회전시킵니다. 이를 해결하는 방법은 olddir 지시문 또는보다 정확한 와일드 카드 (예 : * .log)를 사용하는 것입니다.


3
이 와일드 카드 패턴은 저에게는 효과가 없었습니다. RHEL 7.3에서 로그 3.8.6
노스 벤

globstarlogrotate를 실행하기 전에 활성화해야 할 수도 있습니다 . 이것은 bash에 사용할 수있게합니다 shopt -s globstar.
bat_ventzi 2018 년

나는 같은 문제를 가지고있다. 우분투 16.04.3에서 3.8.7을 로그 로테이션하십시오. ls /var/log/basedir/**/*.log는 설명대로 작동하지만 logrotate는 작동하지 않습니다.
frogstarr78

logrotate 3.11.0에서도 작동하지 않습니다. bash 확장은 logrotate 와일드 카드와 관련이 있다고 생각하지 않습니다. (유사한 구문은 제외)
Thayne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.