Logrotate는 열린 파일을 자르지 않습니다.

Logrotate는 열린 파일을 자르지 않습니다.

테스트 및 데모 플랫폼 역할을 모두 수행하는 시스템이 있습니다. 시스템에서 출력되는 많은 데이터를 기록하고 있는데, 로그 파일이 빨리 채워지고 결국 하드 드라이브의 파티션 공간을 모두 사용하게 되므로 배포할 때는 기록하지 않겠습니다.

시도해 보았 logrotate으나 프로그램이 실행되지 않을 때만 작동하는 것 같습니다. 프로그램이 닫히면 파일을 올바르게 자르고 압축된 버전을 기록한 다음 나머지는 삭제합니다. 그러나 로그 파일을 채우는 프로그램이 실행 중일 때 압축 파일을 올바르게 생성하지만 활성 파일을 자르지 않습니다. 어떻게 자르는지 알아보려고 합니다.

간단한 리디렉션을 통해 로그 파일에 쓰고 있습니다. ProgramA>logAprogramB>logB 내 프로그램은 입력 벡터를 받을 때마다 출력하므로 출력이 매우 빠릅니다. 내 가정은 필드에 대한 지속적인 쓰기로 인해 logrotate가 잘릴 수 없다는 것입니다. 그러나 이것이 이유인지 확인할 수 있는 사람이 있습니까?

logrotate는 오류 파일을 정확히 어디에 저장합니까?

또한: logrotate의 동작을 수정하고 싶습니다. 활성화되어 100MB와 같은 대용량 로그 파일이 표시되면 복사본을 생성하고 싶습니다.오직원본 로그 파일을 자르기 전에 파일의 마지막 1MB를 삭제합니다(파일의 이전 99MB 콘텐츠 삭제). 최신 데이터를 유지해야 하는데 아주 오래된 데이터는 별로 신경 쓰지 않습니다. 누구든지 이 작업을 수행하는 방법을 말해 줄 수 있습니까?

답변1

나는 이것이 약간 오래되었다는 것을 알고 있지만 동일한 문제가 있었고 해결책은 출력 파일을 파괴하는 대신 출력 파일에 대한 추가 리디렉션을 사용하는 것이었습니다. 이렇게 하면 응용 프로그램/스크립트가 파일을 독점적으로 잠그지 않습니다.

바꾸다:

ProgramA > logA

사용:

ProgramA >> logA 

인사.

답변2

에서 man logrotate:

   copytruncate
          Truncate the original log file to zero size in place after creat‐
          ing a copy, instead of moving the old  log  file  and  optionally
          creating  a  new one.  It can be used when some program cannot be
          told to  close  its  logfile  and  thus  might  continue  writing
          (appending) to the previous log file forever.  Note that there is
          a very small time slice between copying the file  and  truncating
          it,  so  some  logging  data  might be lost.  When this option is
          used, the create option will have no effect, as the old log  file
          stays in place.

이는 구성 파일에 넣어야 하는 옵션일 수 있습니다.

다른 질문에 관해서 : postrotate지시어를 사용하여 파일을 회전시킨 후 자르는 명령을 실행하십시오. 이 경우 잘린 후 이 단계에서 수동으로 압축해야 합니다.logrotate (실제로 는 첫 번째 아카이브가 압축되지 않았기 때문에 마지막 부분은 아닙니다 .)

편집하다:마지막 1MB 유지에 대한 자세한 내용을 확인하세요. 로그 파일이 200K를 초과하면 교체하고 5개의 백업만 유지하도록 구성할 수 있습니다. 이렇게 하면 항상 마지막 1MB 정도를 유지하게 됩니다. 첫 번째 백업이 너무 크면 5개의 백업이 완료되어 "떨어질" 때까지 기다릴 수 있습니다.

답변3

약속한 대로 Perl의 몇 줄로 작성된 "충분히 가까운" 링 버퍼 프로그램입니다.

이를 사용하려면 원하는 로그 파일의 크기(바이트)와 두 개 이상의 로그 파일을 전달하십시오. X바이트마다 로그 파일을 전환합니다. 이미 이런 프로그램이 있을 거라 확신하는데 빠른 검색으로는 찾을 수가 없네요. 예를 들어,

$ your-app | log-splitter 1048576 /var/log/your-app/log1 /var/log/your-app/log2

물론 파일이 log-splitter$PATH에서 실행 가능하고 다음을 포함한다고 가정합니다.

#!/usr/bin/perl
use warnings qw(all);
use strict;
use autodie;
use Carp;
use Fcntl qw(SEEK_SET);
use IO::Handle;

# yes, we truncate all logs at start. Sorry.
@ARGV >= 2 or croak "Usage: $0 log-size log-file...";
my ($max_size, @lognames) = @ARGV;
my @logs = map {
    open my $fh, '+>', $_;
    $fh->autoflush(1);
    $fh;
} @lognames;

my $current_size = $max_size;
my $current_log  = $#logs;
while (defined(my $line = <STDIN>)) {
    if ($current_size >= $max_size) {
        $current_log  = ($current_log + 1) % @logs;
        $current_size = 0;
        seek($logs[$current_log], 0, SEEK_SET);
        truncate($logs[$current_log], 0);
    }

    $current_size += length($line);
    print {$logs[$current_log]} $line;
}

close($_) foreach @logs;

이 코드와 관련된 라이센스 문제를 명확히 하려면 다음을 수행하십시오.

CC0
법률이 허용하는 한도 내에서 Anthony DeRobertis는 위 프로그램(로그 분할기)에 대한 모든 저작권 및 관련 권리 또는 저작인접권을 포기합니다. 이 작품의 출판 장소: 미국.

관련 정보