web-dev-qa-db-ja.com

ダムの非対話型アプリケーションのログをローテーションする

Ubuntu10.4サーバー。

サーバー上で常に実行されている、ダムの非対話型のレガシーサービスがあります。

固定名(/var/log/something.log)のファイルにログを書き込んでいます。

ログファイルを手放すためのシグナルは処理しません。そのログファイルをローテーションする必要があります。

アプリケーションを変更せず、ログのデータを失うことなく、これを適切に行う方法はありますか?

8

Ignacioの答えに興味をそそられたので、調査を行って、以下のPerlスクリプトを思いつきました。サービスが名前付きパイプに書き込む場合は、機能し、logrotateで使用できるはずです。

それが機能するためには、ログファイルを名前付きパイプにする必要があります。次に、既存のファイルの名前を変更します

mkfifo /var/log/something.log

要件を満たすように3つのファイル名を編集します。サービスを実行してから、このデーモンを実行します。このデーモンは、名前付きパイプを読み取り、新しいログファイルに書き込みます。

/var/log/somethingrotateable.logの名前を変更してから、デーモンにHUPを送信すると、デーモンはそれ自体を生成し、書き込む新しいsomethingrotateable.logを作成します。 logrotateを使用する場合は、kill -HUP 'cat /var/run/yourpidfile.pid'postrotateスクリプト

#!/usr/bin/Perl -w
use POSIX ();
use FindBin ();
use File::Basename ();
use File::Spec::Functions;
#
$|=1;
#
# Change the 3 filenames and paths below to meet your requirements.
#
my $FiFoFile = '/var/log/something.log';
my $LogFile = '/var/log/somethingrotateable.log';
my $PidFile = '/var/run/yourpidfile.pid';

# # make the daemon cross-platform, so exec always calls the script
# # itself with the right path, no matter how the script was invoked.
my $script = File::Basename::basename($0);
my $SELF = catfile $FindBin::Bin, $script;
#
# # POSIX unmasks the sigprocmask properly
my $sigset = POSIX::SigSet->new();
my $action = POSIX::SigAction->new('sigHUP_handler',$sigset,&POSIX::SA_NODEFER);
POSIX::sigaction(&POSIX::SIGHUP, $action);

sub sigHUP_handler {
#    print "Got SIGHUP";
    exec($SELF, @ARGV) or die "Couldn't restart: $!\n";
   }

#open the logfile to write to
open(LOGFILE, ">>$LogFile") or die "Can't open $LogFile";
open(PIDFILE, ">$PidFile") or die "Can't open PID File $PidFile";
print PIDFILE "$$\n";
close PIDFILE;
readLog();

sub readLog {
sysopen(FIFO, $FiFoFile,0)  or die "Can't open $FiFoFile";
while ( my $LogLine = <FIFO>) {
    print LOGFILE $LogLine;
   }
}
5
user9517

FIFOにログを記録し、FIFOの反対側に接続し、ログをローテーションできるシグナルハンドラーを備えたデーモンを実行します。

SIGSTOPをプロセスに送信し、ログを別の名前にコピーし、ログを切り捨て、SIGCONTをプロセスに送信します。おそらく次のようになります。

 pkill -STOP legendappname 
 cp /var/log/something.log/var/log/something.log.backup
cat/ dev/null>/var/log/something .log 
 pkill -CONT legendappname 

また、次のように、慎重に作成されたローテーション前後のスクリプトとcopytruncateオプションを使用して、logrotateに魔法をかけてもらうこともできます。

/var/log/something {
 daily 
 rotate 5 
 copytruncate 
 prerotate 
#これは、pidファイルがあることを前提としています、もちろん。
#そうでない場合は、代わりに上記のようなpkillになる可能性があります。
 kill -STOP `cat/var/run/legacyappname.pid`
endscript 
 postrotate 
 kill -CONT `cat/var/run/legacyappname.pid`
endscript
}
2
mark

アプリケーションに 名前付きパイプ にログを記録させ、適切なログローテーションメカニズムをサポートするプログラム(たとえば syslog-ng )にログエントリを読み取らせてログに記録させることができます。ファイルに。

1
vwegert