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


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.