로그 회전은 어떻게 작동하나요?

로그 회전은 어떻게 작동하나요?

logrotate내 쉘 파일에서 명령을 실행할 때 이것이 어떻게 작동하는지, 어떻게 작동하지 않는지 이해하는 데 정말 어려움을 겪고 있습니다 .

문제의 명령은 다음과 같습니다.

rclone -L -vv --log-file "/home/mike/tmp/qqq.log"  sync "/media/mike/W10 D drive/My Documents/"  remote:MyDocuments_M17A_from_Linux

내가 원하는 것:

qqq.log 파일을 자주(예: 10분마다) 확인하여 해당 파일이 지정된 크기(예: 1MB)를 초과하는지 확인하고 싶습니다. 그렇다면 파일이 회전됩니다. rclone-vv옵션을 사용하면 의도적으로 많은 출력이 생성됩니다(즉, logrotate가 이 사용 사례에 적합한 이유를 이해하려고 노력함).

꽤 유용한 튜토리얼이 있습니다여기, 하지만 여전히 나에게 단서가 없습니다.

  1. 자체 비시스템 프로세스에 대한 로그 순환을 어떻게 구성할 계획인가요? 바닥에 선을 붙이는 것을 의미합니까 /etc/logrotate.conf? 이것이 제가 한 일입니다("#시스템별 로그는 여기에서 구성할 수 있습니다" 아래).

    /home/mike/tmp/qqq.log {
      notifempty
      size 1M
      daily
      create 0664 root root
      rotate 3
    }
    

    후에:이제는 별도의 파일을 넣을 수도 있다는 것을 깨달았습니다. /etc/logrotate.d거기에서는 복잡하지 않습니다.

  2. 기본적 으로 logrotate이 파일은 하루에 한 번만 실행됩니까 /etc/cron.daily/logrotate?

  3. 이것은 더 자주 확인하고 싶다면 cron이 작업을 10분마다 실행(이 경우)하도록 설정해야 한다는 의미입니까?

  4. 루트로 실행하시겠습니까 logrotate <config file>? 루트와 사용자로 모두 시도해 봤기 때문에 이 질문을 드리는 것입니다. 사용자가 작업을 하지 않는 것 같습니다.

이러한 유형의 설정(드물지 않음)에 대한 초보자 가이드 링크가 도움이 될 것입니다. 검색해 봤지만 제가 찾은 대부분의 내용에는 단계별 가이드가 제공되지 않습니다.

답변1

logrotate해당 사용자의 로그를 회전하기 위해 관리 권한 없이 일반 사용자로 실행할 수 있습니다.

# Create a local per-user configuration file
cat >.logrotate.conf <<'X'
/home/mike/tmp/qqq.log {
    notifempty
    missingok
    size 1M
    rotate 3
}
X

# Run logrotate with that configuration file
/usr/sbin/logrotate -v -s .logrotate.state .logrotate.conf

daily가능한 작업을 하루에 한 번으로 제한하는 순전히 크기 기반 검사를 원했기 때문에 기준을 제거했습니다 ( logrotate상황에 따라 하루에 먼저 실행). 가 아닌 실제 작업으로 출력 파일이 생성되도록 으로 create교체 했습니다 .missingokrclonelogrotate

그런 다음 logrotate사용자 crontab파일에 명령을 입력하십시오.

# Capture any existing crontab entries
crontab -l >.crontab

# Append ours to the list
echo '0 * * * * /usr/sbin/logrotate -s .logrotate.state .logrotate.conf >>.crontab.log 2>&1' >>.crontab

# Reload crontab
crontab .crontab

이 예를 사용하면 명령 출력이 에 기록됩니다 . 매달 항목을 반복하거나 재설정 .crontab.log할 수 있습니다 .logrotate

답변2

자신만의 로그 파일을 생성하고 실시간 크기 절단이 더 필요한 경우 Apache 유틸리티를 확인해야 합니다.로그 회전 여기.

표준 입력을 읽고 명령줄 인수를 기반으로 로그 파일을 분할하는 방식으로 작동합니다.

예를 들어.

program-writing-to-stdout|/bin/rotatelogs /home/mike/tmp/qqq.log 1M"

로그 회전반면, 로그 파일은 런타임 시 확인되며, 일반적으로 시스템은 하루에 한 번 (cron을 통해) logrotate를 실행하도록 설정됩니다. 하위 시스템 구성은 일반적으로 구성 파일을 하위 시스템에 넣어 수행되며 /etc/logrotate.d, 일반적으로 루트로 실행됩니다.

편집자: @mike 설치류

logrotate (cron을 통해 또는 수동으로) 실행하고 파일 시스템에 표시된 로그 파일 통계를 확인하고 해당 구성에 따라 회전을 트리거합니다.

rotatelogs지속적으로 표준 입력을 읽고 로그 파일에 추가한 다음 로그 파일의 시간이나 크기가 트리거 지점에 도달하면 현재 로그 파일을 닫고 새 로그 파일(적절한 이름 지정)을 만든 다음 계속해서 새 로그 파일에 추가합니다. .

이는 출력을 생성하는 프로그램을 시작하는 방법과 관련이 있으며, 표준 출력에 기록한 다음 이를 회전 로그로 파이프해야 합니다.

예를 들어

while true ; do date ; sleep 30 ; done | rotatelogs -n 10 /home/mike/tmp/qqq.log 60

60초마다 잘라내어 10개 파일의 루프를 제공합니다.

을 사용하여 표준 출력에 쓸 수 있기를 rclone원합니다 .--log-file "/dev/stdout"

[편집 2] @mike 설치류

나는 rclone이 stdout에 쓰는지 stderr에 쓰는지, 둘 중 하나에 쓰면 어떻게 되는지 잘 모르지만, 작동하지 않더라도 이 문제를 해결할 수 있는 방법이 있습니다 --log-file=/dev/stdout.

이것StackOverflow 질문/답변등은 리디렉션과 파이프를 설명했습니다. 그러나 요약하자면, stderr만 리디렉션하거나 stdout과 파이프로 병합하는 것이 가능합니다.

큰 타격의 예:

stderr 및 stdout을 파이프로 병합

FirstCommand 2>&1 | OtherCommand

stderr를 파이프에 넣고 stdout을 다른 파일에 넣기만 하면 됩니다(/dev/null일 수도 있고 -stdout을 닫는 하이픈일 수도 있음).

FirstCommand 2>&1 1>otherfile.log | otherCommand

이 예에서는 이전 bash 구문을 사용하며 bash v4는 현대적이고 덜 장황한 변형을 갖습니다.

관련 정보