평소보다 잘못된 크기를 표시하는 Linux 로그 회전 파일

평소보다 잘못된 크기를 표시하는 Linux 로그 회전 파일

springboot 디렉토리에서 로그 회전을 활성화했는데 작동 중이지만 "content-data-svc.log"는 실제로 2MB이지만 ls -ltrh를 수행하면 61MB로 표시됩니다.

로그 파일을 보면 로그 파일에 빈 줄이 더 많아 파일 크기가 커집니다. 로그 파일의 50%는 빈 공간이고 나머지는 로그 항목입니다. 왜 이런 일이 발생하는지 아시나요?

[aemelics@springboot]$ ls -ltrh
total 4.6M
-rw------- 1 aemelics aemelics 1.6M Apr 11 06:44 content-data-svc.log.2.gz
-rw------- 1 aemelics aemelics 1.1M Apr 12 00:44 content-data-svc.log.1.gz
-rw------- 1 aemelics aemelics  61M Apr 12 02:00 content-data-svc.log
[aemelics@springboot]$ du -shx content-data-svc.log
2.0M    content-data-svc.log

다음은 내 logrotate 항목입니다.

[aemelics@springboot]$ cat /etc/logrotate.d/react

/logs/springboot/*.log*
{
su aemelics aemelics
    missingok
    daily
    minsize 20M
    copytruncate
    notifempty
    sharedscripts
    compress
    rotate 5
    postrotate
    endscript
}

답변1

의 출력에서는 파일이 크게 보이지만 의 ls출력에서는 작게 보이고 du회전 후 파일 시작 부분에 빈 공간이 있는 것처럼 보이는 이유는 로그 파일에 기록하는 프로그램이 무엇이든 간에~ 아니다"추가"할 파일을 여는 중입니다.

copytruncate구성 파일 에 설정된 옵션을 사용하여 로그 파일을 교체하면 logrotate파일의 복사본이 생성되고 원본 파일은잘린. 파일이 잘리면 해당 내용은 효과적으로 삭제되지만 파일 자체는 삭제되지 않습니다.

일반적으로 프로그램은 추가하기 위해 파일을 열 것입니다. 이는 로그에 대한 각각의 새로운 쓰기가 다음과 같은 시점에 발생함을 의미합니다.항상 파일의. 파일이 잘리면 다음 로그 줄이 파일의 시작 부분에 기록된다는 의미입니다. 왜냐하면 파일의 끝 부분도 해당 지점이기 때문입니다.

그러나 프로그램의 경우하지 않았다추가 모드에서 파일을 열면 다음 쓰기는 파일이 잘렸는지 여부에 관계없이 마지막 쓰기가 완료된 파일의 오프셋으로 이동합니다.

파일이 에 의해 잘린 경우 logrotate이는 쓰기로 인해 시작과 쓰기가 발생하는 지점 사이에 파일에 구멍이 생성됨을 의미합니다. 이 구멍은 널 바이트로 가득 차 있으며 편집기 vi에는 ^@.

이것이 귀하의 경우에 일어나는 일입니다.

이러한 구멍이 있는 파일을 "희소" 파일이라고 합니다. 홀 자체의 널 바이트는 실제로 디스크에 저장되지 않기 때문에 du상당히 작은 크기를 보이지만, 파일을 처음부터 끝까지 읽으면 61M(파일의 논리적 크기, 즉 파일의 논리적 크기)를 읽게 됩니다. 무엇을 ls보여주는가).

이 문제를 해결하려면

  1. 추가 모드에서 파일을 열 수 있도록 로그 파일에 쓰는 프로그램을 다시 작성하거나
  2. 프로그램에게 말하다다시 열다파일이 회전할 때 로그 파일(이 작업은 일반적으로 프로그램에 HUP에서 신호를 보내 수행 logrotate되지만 프로그램 설명서를 읽어야 함) 또는
  3. logrotate로그가 순환되면 프로그램을 다시 시작하십시오 .

관련 정보