로그 파일 크기를 로그 회전없이 고정 된 상태로 유지


13

비어있는 새 파일로 회전하거나 이전 파일을 삭제 (또는 보관)하지 않고 로그 파일의 파일 크기를 고정 된 상태로 유지할 수있는 방법이 있습니까? 예를 들어, 로그 파일 최대 크기를 1MB로 설정하면 파일 크기가 제한을 초과하여 증가하면 자동으로 고정되고 텍스트는 '꼬리'에 추가되고 텍스트의 가장 오래된 부분은 팝업되어 파일 크기를 1MB로 유지합니다. .


logrotate를 사용하십시오rm -f *.tar.gz.*
Marco Ceppi

1
로그를 회전시키지 않거나 logrotate를 사용하지 않는 특별한 이유가 있습니까? 정확히 어떻게 하시겠습니까? 1M에 이전 로그를 보관하고 새 로그를 시작 하시겠습니까? 질문의 시작은 끝과 완전히 호환되지 않습니다.
David Thornley

튀어 나온 무엇 의미합니까?
tshepang

답변:


4

이를 위해 작은 bash 스크립트를 작성할 수 있습니다. 파일을 사용하여 파일을 특정 바이트 수에 tail -c맞추고 파일을 덮어 쓰십시오.

부터 man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

3
"파일을 덮어 쓰면"새 파일에서 로깅이 자동으로 다시 시작되지 않습니다.
Stephen Jazdzewski

0

유일한 해결책은 자신의 사용자 공간 파일 시스템을 작성하거나 기존 시스템에 기여하는 것입니다. 사용자 공간의 파일 시스템에 있는 부분 목록을보십시오

기여할 기술이 없으면 프로젝트 홍보 또는 $$$ 또는 둘 다를 제공하여 추가하십시오.

나는 그것을 할 시간이 있었으면 좋겠다. 나는 항상 이와 똑같은 것을 원했다.


0

0 바이트 크기의 파일과 비슷한 FIFO를 사용하여 비슷한 작업을 수행 할 수 있습니다.

그러나이 파일에서 아무것도 읽지 않으면 syslog 프로세스가 차단되어 모든 로그 파일에 대한 쓰기가 중지됩니다. 최신 버전의 Ubuntu / CentOS에서이 동작이 변경되었는지 확실하지 않습니다.

한 예로 여기

다른 예를 들어, 이와 같은 것을 시도하십시오.

선입 선출 (FIFO) :

sudo mkfifo /var/log/everything.fifo

그리고 이것을 (r) syslog.conf에 추가 한 다음 syslog를 다시 시작하십시오.

*.*     |/var/log/everything.fifo

그런 다음 한 창에서 FIFO를 봅니다.

cat /var/log/everything.fifo

그리고 다른 창에서 syslog에 물건을 보내십시오.

logger Test1
logger Test2
logger Test3

cat위 의 출력에 "Test *"줄이 표시되어야합니다 .

이 기능은 특히 데이터를 더 오래 유지하지 않아도되는 경우 디버깅에 유용합니다. 예를 들어 방화벽 방화벽을 제외한 모든 항목 만 보려면 다음과 같이 할 수 있습니다.

grep -vi "kernel: .* on wan" /var/log/everything.fifo

0

두 번째 대답은 다음과 같습니다. 이것은 꽤 해킹입니다.

watch (1)를 사용하여 반복적으로 실행하십시오 tail --bytes=1024(해당 @jjclarkson 덕분에 로그 파일의 마지막 1024 바이트).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

그런 다음 파일을 확인하십시오.

less --raw-control-chars /tmp/messages.watch

watchwhile 루프와 의 차이점은 watch/ var / log / messages가 변경된 경우에만 /tmp/messages.watch 만 업데이트 한다는 것입니다.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

그리고 test/ var / log / messages가 업데이트 된 경우에만 꼬리가 실행되도록 while 루프에 넣을 수 있다고 생각 하지만 지금은 알 수 없습니다.


0
 prune-에 설명 된 파일 목록의 상단을 잘라냅니다.
 * 파일 / etc / default / prune. 주기적으로 실행되도록 설계
 * cron에서 아이디어는 자동으로 로그를 줄입니다.
 * 영원히 성장하는 파일. 이 파일에는
 * 파일 (전체 경로 이름) 및 해당 블록 수
 * 유지해야합니다. 정신 건강을 유지하기 위해
 * 다음 줄 바꿈 다음에 파일을 자릅니다. 파일
 * / etc / default / prune은 다음과 같아야합니다 :
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 *
 자두에 대한 infoswx의 crontab 항목은 다음과 같습니다.
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 cc : O -o prune prune.c로 컴파일
 *
 * 다음 정의는 취향에 맞게 조정될 수 있습니다
 * 및 시스템 블록 크기.
 *
 * Ray Davis infoswx! 꿀벌 09/25/85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=ko&ie=UTF-8&q=prune+log+file&pli=1

많은 (대부분? 전부?) 데몬은 HUP 신호를 보내면 로그 파일을 다시 엽니 다 (예 : 프룬을 실행하는 동일한 크론 작업에 의해)


0

나는 원래의 포스터가 8 년 후에 해결책을 찾았다 고 확신한다. 이 스레드를 읽을 수있는 다른 사람들을위한 또 다른 것이 있습니다 ...

curtail은 프로그램 출력의 크기를 제한하고 다음 명령을 사용하여 마지막 200MB의 출력을 유지합니다.

run_program | 축소 -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

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