모든 로그 파일을 자르는 방법?


18

누구든지 /var/log/디렉토리의 모든 로그 파일을 자르는 솔루션을 제공 할 수 있습니까?

지식에 대한 질문은 좋은 생각입니까?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done

1
/var/log시스템이 나중에 필요할 수있는 메시지를 넣는 위치 는 좋지 않습니다 . 우분투는 전에 문제가 발생했습니다. 읽어보십시오 man 8 logrotate;man logrotate.conf.
waltinator 2019

답변:


34

이 시도:

truncate -s 0 /var/log/*log

편집하다:

이 작업을 두 번 이상 수행하려면 logrotate로그를 처리 하는 데 사용해야 합니다. 보통 우분투에 설치됩니다. 살펴보십시오 man logrotate(또는 설치하지 않은 경우 온라인 맨 페이지를 보거나로 설치하십시오 sudo apt-get install logrotate)

맨 페이지에서 :

logrotate는 많은 수의 로그 파일을 생성하는 시스템을 쉽게 관리 할 수 ​​있도록 설계되었습니다. 로그 파일을 자동으로 회전, 압축, 제거 및 메일 링 할 수 있습니다. 각 로그 파일은 매일, 매주, 매월 또는 너무 커질 때 처리 될 수 있습니다.


또한 echo ""> * log를 사용하여 비울 수 있습니다.
Astm

10

첫 번째 수준 로그 폴더의 로그 파일뿐만 아니라 모든 로그 파일 을 지우려면 다음을 사용할 수 있습니다.

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

이미 logrotate실행중인 경우 회전 된 .gz로그도 지워야 합니다.

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

예를 들어 배포를 위해 VM 어플라이언스 컨테이너를 구축하는 것이 유효합니다.

일상적인 유지 관리의 일환으로이 작업을 수행 할 필요 는 없습니다 . DEM이 올바르게 제안했듯이이를 사용하십시오 logrotate.


1

로 후속 @DEN 대답

모든 로그 파일을 찾아 /var/log0 바이트로 자릅니다.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0

1
내가 사용하는 것 *.log*대신하지만 난이 질문에 대해 답을 포함하지 않은, 그래서 나는 확실히 그것을 100 % 안전 경우 아니에요. 있기 때문에 파일을 좋아 dovecot.log-20180930하고 dovecot.log-20180923.gz.
Luka

0

대부분의 POSIX 호환 OS에 일반적으로 적용되는 파일을 완전히 자르는 방법에는 두 가지가 있습니다. 쉘 스크립팅에서 볼 수있는 가장 일반적인 것은 true > file.txt또는 이와 비슷합니다 : > file.txt( bash쉘의 경우 >리디렉션만으로 충분합니다). 그것은 쓰기 전용을 읽거나 파일 이름이 존재하지 않으면 작성 하거나 기존 파일 이름을 자르는 플래그로 syscall 또는 syscall을 >통해 파일을 여는 방법 때문 입니다.open()openat()O_WRONLY|O_CREAT|O_TRUNC

이를 염두에두고 C에서 다음과 같은 것을 구현할 수 있습니다.

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

이 코드를 저장하는 파일 이름을로 지정 trunc.c하고로 컴파일 gcc trunc.c -o trunc하면에서 제공되는 파일 이름 인수를자를 수있는 작은 유틸리티가 trunc ./foobar.txt있습니다. 물론이 코드는 다른 검사를 수행하지 않고 첫 번째 위치 매개 변수 만 자릅니다. 둘 이상의 위치 매개 변수를 처리하는 방법을 알아 내기 위해 독자에게 맡길 것입니다. 참고로 truncate()사용할 수있는 syscall이 있으며 파일을 가변 길이로 자릅니다.

C의 팬이 아니라면 파이썬이 더 쉬울 것입니다. open()명령은 파이썬에서 동일한 원리로 작동합니다-파일 이름이 존재하면 파일을 쓰고 자르기 위해 파일을 엽니 다. 따라서 우리는 할 수 있습니다

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

모든 .log파일 을 찾는 것과 관련하여 이미 다른 답변에서 다뤘 *습니다.bash . 도 있는데 find -type f -name "*.log"이있는, -exec(이 특정 경우에 명령을 실행하기위한 플래그 sh -c ''를 활용하기 >때문에 >쉘 연산자가 아닌 외부 실행 파일입니다). 따라서 당신은 할 수 있습니다

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

같은 또한 디렉토리에 해당 로그 파일을 주목할 필요가 /var/log종종 logrotate에 서비스에 의해 회전되므로, 같은 파일 이름 등이있을 것이다 /var/log/service.log, /var/log/service.log.1당신이 사용 할 수 있도록, 등 *.log.[1-9]대신 패턴


무엇보다도 복사 할 수 있습니다 /dev/null 원하는 파일로 . 이상하게도 /dev/null특수 문자 장치 유형의 파일이지만 다른 곳에서 복사하면 적어도 GNU에서는 결과가 비어있는 일반 파일 cp입니다. 따라서 우리는 할 수 있습니다

cp /dev/null foo.txt

또는

dd if=/dev/null of=foo.txt

다른 제안 된 독서 :


0

logrotate 기능으로 회전하기 위해 / var / logs에서 로그를 회전하는 것이 좋지만 원할 때마다 수행하지 않는 것이 좋습니다. 시스템 로그가 인쇄되며 모든 오류를 디버그하는 데 편리합니다.

logrotate를 사용하지 않아야하는 경우 옵션을 탐색 할 수 있습니다. 일부 유닉스 시스템에서는 잘림이 쉬운 옵션이지만이 명령을 즉시 사용할 수 없으므로 설치해야합니다. 새 명령을 설치할 수 없으면 아래 루프를 사용할 수 있습니다.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done

Bash Pitfall # 1 : 그런 식으로 루프를 쓰지 마십시오. for logfile in /path/*.log대신 사용하십시오 .
PerlDuck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.