logrotate를 사용하여 오래된 로그 파일을 삭제하는 방법

logrotate를 사용하여 오래된 로그 파일을 삭제하는 방법

내 CentOS에는 많은 로그 파일을 생성하는 Logstash가 있습니다. 로그 파일은 다음과 같습니다.

logstash-2023-03-09.log  logstash-2023-03-20.log                   logstash-deprecation-2023-03-08-1.log.gz  logstash-plain-2023-03-14-1.log.gz  logstash-plain-2023-03-25-1.log.gz
logstash-2023-03-10.log  logstash-2023-03-21.log                   logstash-deprecation-2023-03-09-1.log.gz  logstash-plain-2023-03-15-1.log.gz  logstash-plain-2023-03-26-1.log.gz
logstash-2023-03-11.log  logstash-2023-03-22.log                   logstash-deprecation-2023-03-10-1.log.gz  logstash-plain-2023-03-16-1.log.gz  logstash-plain-2023-03-27-1.log.gz
logstash-2023-03-12.log  logstash-2023-03-23.log                   logstash-deprecation.log                  logstash-plain-2023-03-17-1.log.gz  logstash-plain-2023-03-28-1.log.gz
logstash-2023-03-13.log  logstash-2023-03-24.log                   logstash-json.log                         logstash-plain-2023-03-18-1.log.gz  logstash-plain.log
logstash-2023-03-14.log  logstash-2023-03-25.log                   logstash-plain-2023-03-07-1.log.gz        logstash-plain-2023-03-19-1.log.gz  logstash-slowlog-json.log
logstash-2023-03-15.log  logstash-2023-03-26.log                   logstash-plain-2023-03-09-1.log.gz        logstash-plain-2023-03-20-1.log.gz  logstash-slowlog-plain.log
logstash-2023-03-16.log  logstash-2023-03-27.log                   logstash-plain-2023-03-10-1.log.gz        logstash-plain-2023-03-21-1.log.gz
logstash-2023-03-17.log  logstash-2023-03-28.log                   logstash-plain-2023-03-11-1.log.gz        logstash-plain-2023-03-22-1.log.gz
logstash-2023-03-18.log  logstash-2023-03-29.log                   logstash-plain-2023-03-12-1.log.gz        logstash-plain-2023-03-23-1.log.gz
logstash-2023-03-19.log  logstash-deprecation-2023-03-07-1.log.gz  logstash-plain-2023-03-13-1.log.gz        logstash-plain-2023-03-24-1.log.gz

이 모든 것은 Logstash에 의해 생성됩니다.

logrotate이제 오래된 파일을 삭제하는 데 사용하고 싶습니다 .

이것은 내 구성입니다 logrotate.

[envoy@mirror-dfh0splogv logstash]$ cat /etc/logrotate.d/logstash
/var/log/logstash/logstash-20*.log {
    daily
    rotate 15
    compress
    delaycompress
}

/var/log/logstash/logstash-plain*.log.gz {
    daily
    rotate 5
}

내가 원하는 것은 사실 매우 간단하다. 파일 의 경우 logstash-20*.log최신 15개 파일만 보관하고 싶습니다. 의 경우 logstash-plain*.log.gz최신 5개만 유지하고 싶습니다.

그러나 명령을 실행하면 logrotate --force /etc/logrotate.d/logstash모든 파일 이름이 추가 .1되고 파일은 삭제되지 않습니다.

logstash-2023-03-09.log.1  logstash-2023-03-20.log.1  logstash-deprecation-2023-03-07-1.log.gz  logstash-plain-2023-03-13-1.log.gz.1  logstash-plain-2023-03-24-1.log.gz.1
logstash-2023-03-10.log.1  logstash-2023-03-21.log.1  logstash-deprecation-2023-03-08-1.log.gz  logstash-plain-2023-03-14-1.log.gz.1  logstash-plain-2023-03-25-1.log.gz.1
logstash-2023-03-11.log.1  logstash-2023-03-22.log.1  logstash-deprecation-2023-03-09-1.log.gz  logstash-plain-2023-03-15-1.log.gz.1  logstash-plain-2023-03-26-1.log.gz.1
logstash-2023-03-12.log.1  logstash-2023-03-23.log.1  logstash-deprecation-2023-03-10-1.log.gz  logstash-plain-2023-03-16-1.log.gz.1  logstash-plain-2023-03-27-1.log.gz.1
logstash-2023-03-13.log.1  logstash-2023-03-24.log.1  logstash-deprecation.log                  logstash-plain-2023-03-17-1.log.gz.1  logstash-plain-2023-03-28-1.log.gz.1
logstash-2023-03-14.log.1  logstash-2023-03-25.log.1  logstash-json.log                         logstash-plain-2023-03-18-1.log.gz.1  logstash-plain.log
logstash-2023-03-15.log.1  logstash-2023-03-26.log.1  logstash-plain-2023-03-07-1.log.gz.1      logstash-plain-2023-03-19-1.log.gz.1  logstash-slowlog-json.log
logstash-2023-03-16.log.1  logstash-2023-03-27.log.1  logstash-plain-2023-03-09-1.log.gz.1      logstash-plain-2023-03-20-1.log.gz.1  logstash-slowlog-plain.log
logstash-2023-03-17.log.1  logstash-2023-03-28.log.1  logstash-plain-2023-03-10-1.log.gz.1      logstash-plain-2023-03-21-1.log.gz.1
logstash-2023-03-18.log.1  logstash-2023-03-29.log    logstash-plain-2023-03-11-1.log.gz.1      logstash-plain-2023-03-22-1.log.gz.1
logstash-2023-03-19.log.1  logstash-2023-03-29.log.1  logstash-plain-2023-03-12-1.log.gz.1      logstash-plain-2023-03-23-1.log.gz.1

답변1

이를 수행하는 올바른 방법은 애플리케이션 내의 log4j2 구성에 있습니다.예를 들어:

appender.rolling.strategy.delete.ifLastModified.age = 30d

logrotateLogstash에 의해 효과적으로 교체된 파일을 삭제 하려면 이전 로그 파일이 실제로 자체적으로 생성되었음을 확인해야 합니다. 따라서 이와 같은 오래된 파일의 경우 logstash-2023-03-09.log회전하려는 원본 파일은 이고 logstash사용하려는 회전 메커니즘은 날짜 확장자 형식을 추가하는 것입니다 -%Y-%m-%d.log. 그러면 다음과 유사한 구성 파일이 생성됩니다.

# for eg logstash-2023-03-09.log
"logstash" {
 dateext
 dateformat -%Y-%m-%d.log
 daily
 rotate 15
}

--force이것이 작동하려면 "트리거" 파일이 사용되더라도 존재해야 하므로 logstash처음 실행하기 전에 수동으로 빈 파일을 생성해야 합니다. 예를 들어 logstash-2023-04-01.log오늘 날짜인 경우 회전될 예정이므로 create트리거 파일을 다시 생성하는 옵션도 필요합니다. 또한 이름이 변경된 가짜 파일을 제거해야 합니다. 구성 파일은 다음과 같습니다.

# for eg logstash-2023-03-09.log
"logstash" {
 dateext
 dateformat -%Y-%m-%d.log
 daily
 rotate 15
 create
 postrotate
  f=logstash-$(date +%Y-%m-%d).log; [ ! -s "$f" ] && rm "$f"
 endscript
}

삭제할 파일이 비어 있는지 확인합니다. 로깅 응용 프로그램이 파일을 먼저 생성한 경우 logrotate가 트리거 파일을 회전하지 않습니다.

파일에 대한 유사한 항목은 다음 logstash-plain-2023-03-25-1.log.gz 과 같습니다.

# for eg logstash-plain-2023-03-25-1.log.gz
"logstash-plain" {
 dateext
 dateformat -%Y-%m-%d-1.log.gz
 daily
 rotate 5
 create
 postrotate
  f=logstash-$(date +%Y-%m-%d)-1.log.gz; [ ! -s "$f" ] && rm "$f"
 endscript
}

트리거 파일 logstash-plain도 수동으로 생성해야 합니다.

이것은 해킹이므로 파일을 별도의 디렉토리에 복사하고 사용하지 마십시오 --force. 두 번째 실행을 위해 24시간을 기다린 후 -v무슨 일이 일어나고 있는지 확인하십시오.

관련 정보