로그를 지우는 적절한 방법이 있습니까?


64

일반적으로 로그를 지우는 적절한 방법이 있는지 궁금합니다.

우분투를 처음 사용하고 Postfix를 설정하려고합니다. 문제의 로그는 /var/log/mail.log입니다. 내가 들어가서 모든 줄을 삭제하고 저장하는 것이 아니라 그것을 지우는 올바른 방법이 있는지 궁금합니다. 로그를 지우고 저장 한 직후 오류가 기록되지 않는 경우가 있습니다.

참고 사항 : Postfix를 설정하는 데 문제가 있으며 스크롤을 아래로 스크롤하는 대신 나를 도울 수 있기를 바라는 로그를 쉽게 읽을 수 있도록 노력하고 있습니다.


2
파일의 끝을보고 싶다면 tail 은 친구입니다. tail /var/log/mail.log를 누르면 마지막 5 줄이 표시됩니다. tail -f /var/log/mail.log는 파일 끝에 쓰여진 모든 행을 봅니다.
user9517 2016 년

답변:


79

당신이 사용할 수있는:

> /var/log/mail.log

파일을 편집하지 않고도 로그가 잘립니다. 또한 공간을 되 찾을 수있는 안정적인 방법이기도합니다. 때로는 사람들이 로그에서 rm을 사용하여 파일 이름을 다시 작성하는 실수를 저지 릅니다. 다른 프로세스에 파일이 열려 있으면 해당 프로세스가 닫힐 때까지 공간을 확보하지 못하고 권한을 엉망으로 만들 수 있습니다.

또한 로그 내용을보고있는 경우 다음 tail명령 을 사용할 수 있습니다 .

tail -f /var/log/mail.log

Ctrl-C는 광미를 끊습니다.


2
/bin/csh(FreeBSD에서 일반적)은 "Invalid null command"를 사용하여 이것을 구제하는 반면, zsh(인기 대체품 bash)은 EOF를 기다립니다.
poige

어떻게 예약 할 수 있습니까? >crontab 에 구문을 넣는 것은 구문으로 인식되지 않을 수 있으므로 실행되지 않습니다
ishandutta2007

26

예, 올바른 방법이 있습니다. 로그를 전혀 지우지 않습니다 . 당신 그들을 회전 합니다. 회전에는 이전 N 로그 파일이 N 관련 파일 이름 세트로 유지 된 상태에서 동일한 이름으로 새 파일로 로그 출력을 전환하는 작업이 포함됩니다.

로그를 회전시키는 방법은 처음에 로그를 쓰는 방법에 따라 다릅니다. 이것은 종종 간과되는 요점입니다. 일부 로깅 프로그램은 로그 파일에 대해 열린 파일 설명자를 유지하므로 파일을 삭제해도 공간이 확보되지 않거나 실제로는 새로운 로그 파일로 출력을 전환하지 않는다는 점을 언급하면서 여기에 대한 답변 중 일부는 적어도 그것에 대해 언급합니다.

예를 들어, 로그 파일을 작성하는 프로그램 multilogdaemontools패키지 에서 온 것이라면 수동 스크립트 나 cron작업 없이 로그를 전혀 회전시키는 작업을 수행하지 않습니다 . 간단히 multilog로그 출력이 디렉토리에 있다고 말하면 자동으로 회전되고 크기가 제한된 N 로그 파일 세트가 해당 디렉토리에 유지됩니다.

로그 파일을 작성하는 프로그램 이 다른 패키지 svlogdrunit패키지 인 경우에도 동일하게 적용됩니다. 디렉토리에서 도구를 가리키는 것 외에는 아무것도하지 않습니다. 자체적으로 해당 디렉토리에 자동으로 회전하고 크기가 제한된 N 개의 로그 파일 세트를 유지합니다.

rsyslog로그 파일을 작성 하는 데 사용 하는 경우 로그 파일이 특정 크기에 도달 한 후 중지하고 스크립트를 실행하면 로깅 프로그램에 지시 할 수 있습니다 . 실제로 로그 파일의 이름을 바꾸고 전체 크기 제한에 따라 오래된 로그 파일을 삭제하려면 스크립트의 핵심 요소를 작성해야하지만 최소한 로깅 프로그램은 파일을 닫고 로그 작성을 일시 중지했습니다.

여전히 syslog-ng같은 프로그램을 로깅하고 여기에 다른 답변에서 언급 한 것과 같은 도구로 표시 되는syslogd 로그 회전 의 오래된 방법 은 다소 우연입니다. 정기적으로 로그 파일의 이름을 바꾸는 작업을 실행 하고 로깅 데몬을 다시 시작합니다 (실행중인 데몬 감독자 사용). 물론 이것의 문제는 전체 크기 제한을 강요하지 않는다는 것입니다. 느린 주에는 N 개의 매우 작은 일일 로그 파일을 얻을 수있는 반면, 바쁜 날에는 크기 제한을 훨씬 초과하는 1 개의 매우 큰 로그 파일을 얻을 수 있습니다. logrotatedjangofancron

나중에 더 나은 같은 도구 이유입니다 multilogsvlogd파일 크기 구성 옵션이 실제로 로그 파일은 물론, 스스로 크기를 확인합니다. 세계는 cron작업이나 logrotate데몬 을 사용하여 일정에 따라 로그를 폴링하면 크기가 잘못되고 이러한 검사를 수행 할 수있는 적절한 장소가 남으므로 관리자가 정의한 크기 제한을 엄격하게 적용한다는 것을 알게되었습니다. 로그 파일은 파티션을 삼키지 않고 실제로 파일을 실제로 쓰는 프로그램에 있습니다.


rsyslog의 경우 YEAR, MONTH 및 DAY를 포함하여 "패턴"으로 설명 된 파일 이름을 사용하도록 쉽게 구성 할 수 있습니다. template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")지시어 를 갖는 것만 큼 간단하며 그 뒤에는 if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. 이런 식으로, 로그 회전은 최소한 하루에 한 번의 파일이 정상일 때 문제가되지 않습니다. 매우 많은 양의 로그 (하루에 여러 번 회전해야 함)의 경우 $HOUR도 있습니다.
Damiano Verzulli

13

이것도 사용할 수 있습니다 ..

truncate /opt/package/logs/*.log --size 0

여기서 / opt / package / logs의 모든 로그 파일은 비어있게됩니다.


나는 이것이 이전 답변보다 더 나은 방법을 보지 못했습니다.
kasperd

4
이것은 실제로 매우 좋은 대답이며 로그 파일을 자르는 적절한 방법이 있는지에 대한 질문에 직접 대답하는 유일한 방법입니다. 다른 답변보다 낫습니다. 로그 파일을 삭제하지 않고 내용을 올바르게 제로화하므로 권한 오류와 로그 파일이 누락되어 일부 데몬이 패닉 상태가되지 않습니다.
hmedia1

11

예, Linux 용 LogRotate 도구가 있습니다.


9
작은 수정 사항 : 이것은 서비스가 아니며 일반적으로 cron 서비스에서 실행되는 도구입니다.
RVS

10

로그를 지우는 이유는 공간을 확보하는 것이므로 프로그램 쓰기를 방해하지 않고 cat / dev / null을 사용할 수 있습니다. 절대로 삭제하지 마십시오! 일부 소프트웨어는 다음에 다시 시작할 때까지 작업을 중지하거나 로그를 완전히 무시하여 불만을 제기 할 수 있습니다.

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

3
로그 파일을 재귀 적으로 지우려면 :for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai

4

짧고 호환되는 컨텐츠 덮어 쓰기 : : > /dest/file

그러나 truncate많은 * NIX 에는 truncate (2) 시스템 호출과 해당 사용자 공간 도구 가 있습니다.


1

파일을 정리하기 전에 파일을 유지하려면 다음을 수행하십시오.

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

로그에서 특정 문자 나 이메일을 검색하려면 grep을 사용할 수 있습니다. 메일 사용에 대한 그래픽을 유지하려면 AWStats를 사용할 수 있습니다.


1

방법은 다음과 같습니다. 이것은 NGINX 전용이므로 모든 로그 파일에서 작동하도록 제거 할 수 있습니다.

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}

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