stdout의 로그 회전?


53

stdout 및 stderr에 정보를 쓸 수있는 Linux 프로그램이 있습니다.

해당 출력을의 파일로 리디렉션하는 쉘 스크립트가 /var/log있습니다. (비아 >>2>&1.)

해당 로그 파일을 회전시키는 방법이 있습니까? (최대 크기, 다른 파일로 전환, 제한된 수의 파일 만 유지)

나는 logrotate프로그램 에 대해 이야기하는 몇 가지 답변을 보았습니다. 좋은 소리이지만 내부적으로 로그 파일을 생성하고 HUP 신호를 처리하는 프로그램에 초점을 맞추는 것 같습니다. 기본 출력 리디렉션 스크립트로이 작업을 수행하는 방법이 있습니까?


1
회전 논리를 포함하도록 출력을 리디렉션하는 스크립트를 수정할 수없는 이유는 무엇입니까?
MaQleod 2016 년

누군가가 로그 파일의 크기를 감지하고 해당 프로세스를 방해하지 않고 프로세스 stdout에서 회전시키는 방법을 말해 줄 수 있다면 가능합니다. 더 나은 옵션이 있다면 사용 하지 않아도 됩니다 logrotate. 토론을위한 편리한 시작점처럼 들립니다.
Miral

2
logrotate를 사용할 필요는 없지만 logrotate를 사용하면 시간을 절약 할 수 있습니다. 일반적으로 바퀴를 재창조하는 지점은 거의 없습니다.
bubu

정확히 내 요점. 진행중인 프로세스의 리디렉션 된 표준 출력으로 로그 회전 작업을 수행하는 방법이 있습니까?
Miral

답변:


44

다른 방법으로, 다음과 같이 크기가 제한되고 자동으로 회전되는 로그 파일 세트를 유지 관리하는 기본 목적으로 설계된 도구를 통해 출력을 파이프 할 수 있습니다.

multilog형식 로그 파일 세트 를 처리하는 도구에는 다음이 포함됩니다.

추가 자료


1
고마워, multilog내가 필요한 것 같아
Miral

multilog는 데비안에서 유일한 플러그 앤 플레이 솔루션 인 것 같습니다 (daemontools에는 공식 패키지가 있습니다). 그러나 필자의 경우 fat32 파티션에 로그를 저장하려는 경우 멀티 로그가 심볼릭 링크를 사용하기 때문에 회전이 작동하지 않습니다. 플러그 앤 플레이 없음 :)
Arnout

multilog어디에도 심볼릭 링크를 만들거나 요구 하지 않으므로 사실이 아닙니다 . 그들에 관해서는 완전히 중립입니다.
JdeBP

"이 세기에 logrotate 또는 newsyslog를 사용하지 마십시오"의 URL에 추가 점이 있습니다
duyue

15

rotatelogs아파치와 함께 제공 되는 도구 ( bindir에 있음) ( docs 참조 )는 stdin에서 입력을 받고 특정 시간이 지나면 로그를 회전시킵니다.


14

표준 로그 스트림 중 하나 (syslog, 데몬, cron, 사용자, 보안, 메일 등)로 이동할 수 있으면 logger명령과 파이프를 대신 사용할 수 있습니다 .

echo "Hello." | logger -p daemon.info

그렇지 않으면 로그 된 내용을 사용자 지정 프로그램이나 스크립트로 파이프하여 처리하거나 logrotate구성 설정을 확인하는 것이 좋습니다.

편집 : JdeBP의 대답은 당신이 찾고있는 것을 가지고있는 것 같습니다.


2
단순화를 위해 +1 BTW, 당신은 또한 (귀하의 예제에서 데몬) 사용자 정의 대신에 표준 것들의 시설 (local0에서) 구성 할 수 있습니다
로저 Keays

14

비슷한 문제가 있었고 처음에는 logrotate를 삭제했지만 logrotate는 실제로이 작업을 수행 할 수 있다는 것이 밝혀졌습니다. 주요 지시어는 " copytruncate "입니다. 어떤 이유로 그 용어가 내가 한 인터넷 검색에 나오지 않았 으므로이 경우 어떻게 사용하는지 명확히하기 위해이 답변을 추가하고 있습니다.

트릭은 리디렉션이 " > "(만들기) 대신 " >> "(추가) 로 수행되는 경우 에만 작동 합니다 .

구성 파일 (truncate.cfg) :

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}

테스트 프로그램 (파일을 포기하지 마십시오). 디스크를 채우는 것을 볼 수 있지만 로그 파일을 삭제하면 실제로 디스크의 공간을 확보하지 못합니다.

cat /dev/urandom >> /tmp/temp.log

로그 회전 실행 :

logrotate truncate.cfg

좋은 이론이지만 실제로 시도한 시스템에서는 작동하지 않습니다. 파일은 실제로 잘리지 않으며 프로그램은 이전과 같이 계속 파일에 추가합니다. (그렇습니다. >>를 통해 경로 재 지정한 경우에도 마찬가지입니다.) ((BTW,이 답변은 이미 이전에 제공되었습니다.))
Miral

1
logrotate 에서 논의한 바와 같이 (Unix & Linux 사이트에서) 원본 파일을 자르지 않습니다 . 또한 echo /dev/urandom >> /tmp/temp.log13 개의 결정 문자를 쓴 /tmp/temp.log다음 즉시 종료됩니다. 당신은 의미 했습니까 cat /dev/urandom?
G-Man

2
방금 여기에서 테스트했는데 작동하는 것 같습니다. 파일 내용이 새 로그 파일로 복사됩니다. 원본 파일은 프로세스에 의해 열린 상태로 유지되며 잘립니다 (크기가 0으로 표시됨).
Philipp

1
copytruncate로 가능한 데이터 손실에주의하십시오.
wanghq

1
+1이지만 "파일 복사와 잘라 내기 사이에 시간 분할이 매우 작으므로 일부 로깅 데이터가 손실 될 수 있습니다."
Tagar

3

진행중인 프로세스의 리디렉션 된 표준 출력으로 로그 회전 작업을 수행하는 방법이 있습니까?

예! logrotate가 제공하는 "copytruncate"지시문을 확인하십시오. 이를 지정하면 logrotate가이 상황을 처리하도록 지시합니다. 로그 파일을 무기한 열린 상태로 유지하는 간단한 프로그램입니다.

한 가지 경고는 현재 상황에서 문제가 될 수도 있고 아닐 수도 있습니다.

파일 복사와 잘라 내기 사이에는 시간 분할이 매우 작으므로 일부 로깅 데이터가 손실 될 수 있습니다.

일화 적으로, 나는 사용자가이 지시어를 적용하도록 장려하는 "실제"로그 소스를 보았습니다. 이 옵션에 대한 설명이 여기 있습니다 .


3

split을 사용하면 coreutils의 일부입니다. stdin을 가져 와서 청크로 분할 할 수 있습니다 (청크 크기 또는 행 수 등을 기반으로 함).

예:

app | split --bytes 1G - /var/logs/put-prefix-here

참고 대시 (-)는 "split"에 파일 대신 stdin을 사용하도록 지시합니다.


그 방법을 설명하기 위해 답을 넓힐 수 있습니까? 감사.
fixer1234

예를 들어 답장을 업데이트했습니다.
Nazar

1G는 임의의 크기이며, 그 후에 새 파일을 시작합니까?
fixer1234

1
이것은 한 파일에서 메시지의 절반과 다음 파일에서 절반의 메시지로 끝날 수 있기 때문에 문제에 대한 부분적으로 좋은 해결책은 아닙니다. 또한 split큰 버퍼가 될 수있는 데이터 가있는 동안 컴퓨터가 충돌하면 데이터가 손실 될 위험 이 있습니다. 이 문제를 올바르게 해결하는 여러 도구가 있으므로 이러한 종류의 롤업 솔루션을 전혀 권장 할 수는 없다고 생각합니다.
David Richerby 2016 년

1
@David Richerby- 버퍼링되지 않은 -u를 추가하는 방법은 무엇입니까?
Nick

3

나는 multilog유스 케이스를 좋아 하지만 유스 케이스는 너무 사소하고 단순하여 내가 찾은 문서 / 예제에 매우 간단하게 설명되어 있지 않습니다. 다음은 간단한 멀티 로그 회전 예제입니다.

mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1

몇 가지 참고 사항 :

  • 이것은 / tmp / myapp / 디렉토리에 로그를 덤프합니다.
  • s10000은 10,000 바이트를 나타냅니다 *
  • n5는 5 개의 파일을 나타냅니다. * '현재'로그는 파일 중 하나로 간주되므로 여기에는 4 개의 이전 로그 + '현재'가 포함됩니다.
  • 이것은 François Beausoleil의 http://blog.teksol.info/pages/daemontools/best-practices 에서 제공 한 예제를 기반으로합니다.
  • 나는 많은 옵션을 이해하지 못합니다-이것을 확장하기 위해 다양한 문서를 참조하십시오 ...
  • 문서는 경고합니다 : "Note that running processor may block any program feeding input to multilog."여기서 '프로세서'는 '!tai64nlocal'명령 의 일부입니다

* 많은 응용 분야에서 장기 사용에 적합하지 않습니다. 이를 통해 큰 로그보다 로그를 채우고 회전하는 동작을 더 빨리 관찰 할 수 있습니다.

마지막으로, 필요한 경우 nohup하는 것을 잊지 마십시오! nohup을 사용하면 2>&1(s = 10e6 및 n = 30)이 필요하지 않습니다 .

mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &

이 명령은 시작해야합니다.


1

위의 Sam Hendley의 의견에 추가하고 싶었습니다.

트릭은 리디렉션이 (만들기) >>대신 (추가)로 수행되는 경우에만 작동합니다 >.

Logrotate copytruncate가 아름답고 예상대로 작동 >하면 (만들기) 를 사용하면 원본 파일이 계속 커지는 것과 동일한 문제가 발생했습니다 >>. 원본 파일은 0 바이트로 돌아가고 프로그램은 계속 쓰기를합니다.

STDOUT 및 STDERR을 회전 로그 파일로 경로 재 지정하십시오.

  1. some-program.sh >> /tmp/output.txt 2>&1 &
  2. /etc/logrotate.d내 경우에는 output_roll이라는 무엇이든 아래에서 logrotate 구성 파일을 만듭니다 .

    내 경우의 샘플 구성 :

    /tmp/output.txt {
        notifempty
        missingok
        size 1G
        copytruncate
        start 0
        rotate 15
        compress
    }
    
  3. /etc/crontab파일 내부에서 크론 작업 설정

    *  *  *  *  * root /usr/sbin/logrotate /etc/logrotate.d/output_roll
    

    매분마다 파일을 확인합니다. 필요에 맞게 조정할 수 있습니다.

  4. 시작하십시오 :

    $> service crond restart
    
  5. 그게 다야

참고 : SELinux를 설정하는 데 문제가있어서로 SELINUX=enforcing설정했습니다 SELINUX=disabled.


1

나는 이번 주말에 logrotee를 썼다 . @JdeBP의 훌륭한 답변과를 읽었다면 아마 아닐 것 multilog입니다.

나는 가볍고 출력 덩어리를 bzip2로 압축하는 데 중점을 두었습니다.

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

그러나 아직 수행하고 테스트해야 할 것이 많이 있습니다.

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