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

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

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

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



답변

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

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


답변

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

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

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

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

    local5.* /var/log/mylogfile

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


답변

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
}


답변

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


답변