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로그 회전에서 프로그램을 다시 시작하십시오.

관련 정보