리눅스에서 여유 공간 중심의 로그 회전?


8

누군가가 방금 '응용 프로그램에 대한 로그를 얼마나 오래 보관해야합니까?'라고 물었고 공간이 부족한 것 외에는 버릴 이유가 없기 때문에 대답은 '디스크가 가득 찰 때까지'였습니다.

그러나 표준 로그 로테이션은 특정주기 + 회전 수를 지정하기를 원합니다. "매일 회전하고 여유 공간이 5 % 밖에 없을 때까지 원하는만큼 많은 기록을 유지하십시오"라고 말할 수있는 비슷한 것이 있습니까?

플랫폼은 Redhat Linux입니다.


1
디스크가 가득 찰 때까지 로그를 보관하는 것은 실제 환경에 적용될 수 있지만 대부분 가상 서버와 클라우드로 이동함에 따라 파일 시스템 크기는 가능한 한 작아야 비용이 절감됩니다. 이 경우 보존 정책을 정의하지 않아도됩니다.
jfg956

답변:


9

firstaction 또는 lastaction 지시문을 사용하여 디스크 여유 공간을 테스트하는 쉘 스크립트를 호출 한 다음 가장 오래된 파일에서 삭제를 실행할 수 있습니다.

   firstaction/endscript
          The lines between firstaction and endscript (both of which must appear on lines by themselves) are
          executed (using /bin/sh) once before all log files that match the wildcarded pattern are  rotated,
          before  prerotate  script  is  run  and  only if at least one log will actually be rotated.  These
          directives may only appear inside a log file definition. Whole pattern is passed to the script  as
          first  argument.  If  the script exits with error, no further processing is done. See also lastac-
          tion.

최신 정보:

실행할 수있는 스크립트 유형에 대한 Stackoverflow 게시물은 다음과 같습니다.

/programming/7523059/remove-oldest-file-in-repository


1

logrotate 자체에는 그러한 옵션이 없습니다. 여유 공간이 기준 아래로 떨어질 때마다 제거 할 가장 오래된 로그를 찾는 cron 스크립트를 추가 할 수 있습니다. 다른 유효성 검사도 수행 할 수 있습니다. 그러나 디스크가 항상 가득 차면 시스템이 큰 임시 파일을 만들 수없고 응용 프로그램 오류가 발생할 수 있기 때문에 좋은 생각이 아닙니다.


하나의 파일 시스템에 모든 것이 있으면 좋지 않을 수 있습니다. 그러나 다른 로그를 피하기 위해 내 로그는 자체 파일 시스템에 있습니다.
kdt

아, 괜찮습니다. fs가 있으면 청소, dh / fs를 수행하고 awk 또는 cut을 사용하여 사용 된 %를 추출하는 스크립트를 작성하는 것이 간단 해지며, 그 수치에 따라 exec로 찾기를 시작할 수 있습니다 rm. 나는 종종 스크립트를 작성하지 않고 crontab 자체에 하나의 라이너를 넣습니다.
johnshen64

0

로그가 사용 가능한 모든 디스크 공간을 채우고 싶지 않은 경우가 있음을 지적하고 싶었습니다. 씬 프로비저닝 된 / var 디렉토리를 가진 여러 호스트를 처리했으며 로그를 특정 크기로 유지하는 것이 중요했습니다. 크기를 줄이기 위해 logrorate와 함께 cronies 작업을 사용했습니다. splunk 또는 syslog-ng와 같은 중앙 로그 서버가 더 나은 옵션 일 수 있지만 환경에서 비슷한 것을 사용할 수 있습니다.


0

@cjc가 제안했듯이 firstaction을 사용할 수 있습니다. 이 예제를보십시오 :

/mnt/user/logs/*.log  /mnt/user/logs/*/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        su root www-data
        create 760 root www-data
        firstaction
          for file in `find  -type f -size +1024M`; do
              percent=`df -h | grep /mnt/user | awk '{print $5}' | sed 's/%//'`
              if [ $percent -gt 50 ]; then 
                  echo "Removed $file" >> /mnt/user/logs/logrotate.log
                  rm $file
              fi
           done;
        endscript
}

이 예에서는 파티션 사용 공간이 50 % 이상인 경우 / mnt / user 파티션 에서 1GB 보다 큰 파일을 제거했습니다 .

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