logrotate가 파일을 옮긴 후에 stdout을 파일로 계속 리디렉션하는 방법은 무엇입니까?


22

화면에 많은 로그를 출력하는 간단한 스크립트가 있으며 STDOUT을 파일로 파이프하여 로그를 저장합니다. 이 스크립트는 오래 실행되므로 로그 파일을 회전시켜 더 관리하기 쉬운 작은 로그 파일로 만들어야했습니다.

내가 직면 한 문제는 일단 logrotate현재 로그 파일을 새 로그 파일로 옮기면 새로 작성된 로그 파일이 더 이상 로그로 채워지지 않는다는 것입니다. 원래 로그 파일이 제거되면 파일 처리기가 손실되고 리디렉션이 더 이상 작동하지 않는 것 같습니다.

또한 이 게시물 은 나와 같은 문제가 있으며 출력을 리디렉션하는 >>대신 사용하여 해결할 수 있다고 주장합니다 >. 나는 그의 솔루션을 테스트했지만 그것은 효과가 없었다. 누구나 리디렉션 작업을 유지하는 방법을 알고 있습니까?


4
잘린 파일에 쓰려는 경우 여전히 ">"대신 ">>"를 사용하는 것이 좋습니다. 추가 모드에서 ">>"를 열면 파일 끝까지 검색합니다. 쓸 때마다. 이렇게하면 파일을 자르면 (XXXX 바이트에서 0 바이트로 이동) "끝까지 탐색"되므로 이제 바이트 0 이후에 써야한다는 것을 알게됩니다. 그렇지 않으면 바이트 XXXX 후에 쓸 수 있습니다. 이전에 XXXX 널 바이트로 스파 스 파일을 작성하십시오 (예 : ">"일 때 fd는 파일의 위치를 ​​기억하고 파일 크기를 줄이지 않고도 파일에서 쓸 수 있습니다!)
Olivier Dulac

답변:


25

이 로그 파일의 logrotate 구성에서 copytruncate 지시문을 사용해야합니다.

copytruncate 이전 로그 파일을 이동하고 선택적으로 새 로그 파일을 만드는 대신 복사본을 만든 후 원래 로그 파일을 잘라냅니다. 일부 프로그램이 로그 파일을 닫으라고 지시 할 수 없어서 이전 로그 파일에 계속 기록 (추가) 될 수있는 경우에 사용할 수 있습니다. 파일 복사와 잘라 내기 사이에는 시간 분할이 매우 작으므로 일부 로깅 데이터가 손실 될 수 있습니다. 이 옵션을 사용하면 이전 로그 파일이 그대로 유지되므로 작성 옵션이 적용되지 않습니다.


2
언급 할만한 가치가있을 수 있습니다. 짧은 시간 동안 compress작업 전에 데이터가 복제됩니다. 그것은 우리에게 한 번 문제를 일으켰지 만 lv공간 한계에 근접해서는 안 되었기 때문에 나빴습니다 . 또한 man스 니펫에 설명 된대로 복사 및 자르기 작업간에 일부 로그 데이터가 손실 될 수 있습니다.
벨민 페르난데스

6

대안으로 다음을 수행 할 수도 있습니다.

  • 전용 설비 (예 : local5)를 사용하여 파이핑 대신 스크립트에서 로거 유틸리티를 사용하십시오. 예 :

    logger -p local5.info -t myscriptname "this is some log data"

  • 이 기능을 원하는 로그 파일에 쓰도록 syslog를 구성하십시오 (예 : (rsyslog.conf)).

    local5.* /var/log/mylogfile

  • 이 로그에 대한 설정 로그 회전 규칙.


이것은와 같은 명시적인 출력 명령이있는 경우에만 작동합니다 echo. 스크립트에서 호출되고 무언가를 출력하는 타사 도구의 출력은이 방법으로 로거로 리디렉션 될 수 없습니다.
Daniel Alder

4

Iain 솔루션의 또 다른 대안 postrotate은 회전이 발생 하면 스크립트 를 사용하여 스크립트를 다시 시작하는 것입니다. 이것은 많은 데몬 (데몬을 다시 시작하거나 다시로드)에 대해 수행되지만 스크립트를 알지 못합니다.이 솔루션이 귀하에게 적합한 지 알 수 없습니다 (스크립트는 이전에 생성 된 일부 상태에 의존합니까?).

내용 /etc/logrotate.d/your-script-name:

/var/log/your-script-name.log {
    # your current logrotate options
    ...
    postrotate
        # this supposing you have the current pid stored
        cat /run/your-script-name.pid | xargs -r kill
        #relaunch it again
        /usr/local/bin/your-script-name
    endscript
}

0

stdout을 "split"(linux의 coreutils의 일부)으로 파이프 할 수 있습니다. 파일 / stdin을 크기, 행 수 등을 기준으로 청크로 나눌 수 있습니다. 청크를 얻은 후에는 필요한 경우 로그 회전으로 파일을 관리 할 수 ​​있습니다.

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