Putar log dari aplikasi non-interaktif bodoh

8

Ubuntu 10.4 Server.

Saya memiliki layanan lawas non-interaktif bodoh yang berjalan terus-menerus di server saya.

Itu sedang menulis log-nya ke file dengan nama tetap (/var/log/something.log).

Itu tidak menangani sinyal apa pun untuk melepaskan file log. Saya perlu memutar file log itu.

Apakah ada cara untuk melakukan ini dengan benar tanpa mengubah aplikasi dan tanpa kehilangan data dalam log?

Alexander Gladysh
sumber

Jawaban:

5

Jawaban Ignacio membuat saya penasaran, jadi saya melakukan riset dan membuat skrip Perl di bawah ini. Jika layanan Anda akan menulis ke pipa bernama itu harus berfungsi dan dapat digunakan dengan logrotate.

Agar bisa berfungsi, Anda perlu membuat file log Anda menjadi pipa bernama. Ganti nama file yang ada kemudian

mkfifo /var/log/something.log

dan untuk mengedit 3 nama file untuk memenuhi persyaratan Anda. Jalankan layanan Anda kemudian daemon ini yang harus membaca pipa bernama dan menulisnya ke file log baru.

Jika Anda mengubah nama /var/log/somethingrotateable.logkemudian mengirim HUP ke daemon itu akan muncul sendiri dan membuat baru somethingrotateable.loguntuk menulis. Jika menggunakan logrotate, postrotateskrip darikill -HUP 'cat /var/run/yourpidfile.pid'

#!/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;
   }
}
user9517
sumber
8

Log ke FIFO, kemudian jalankan daemon yang menghubungkan ke sisi lain dari FIFO dan memiliki penangan sinyal yang memungkinkan Anda untuk memutar log.

Ignacio Vazquez-Abrams
sumber
2

Kirim SIGSTOP ke proses, salin log ke nama lain, potong log, kirim SIGCONT ke proses, mungkin seperti ini:

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

Anda juga bisa meminta logrotate melakukan keajaiban untuk Anda dengan skrip pra dan pasca rotasi yang dibuat dengan hati-hati dan opsi copytruncate, seperti:

/ var / log / something {
    harian
    putar 5
    copytruncate
    hak prerotasi
        # Ini mengasumsikan Anda memiliki file pid, tentu saja.
        # Jika tidak, ini bisa berupa pkill seperti di atas.
        bunuh -STOP `cat / var / run / legacyappname.pid`
    naskah akhir
    postrotate
        bunuh -CONT `cat / var / run / legacyappname.pid`
    naskah akhir
}
menandai
sumber
Opsi menarik, terima kasih. Apa yang akan terjadi dengan koneksi soket ke aplikasi dan darinya saat berhenti? Saya khawatir tentang terputus.
Alexander Gladysh
Selain itu, aplikasi sedang dijalankan di bawah runit. Apa yang akan dilakukan monitornya jika proses aplikasi dihentikan?
Alexander Gladysh
Perilaku koneksi akan tergantung pada batas waktu yang ditetapkan dengan dan waktu yang diperlukan untuk melakukan rotasi yang sebenarnya. Saya tidak akan membayangkan bahwa Anda akan mengalami masalah di sana kecuali log sangat besar. Saya tidak punya pengalaman dengan runit jadi saya tidak bisa memberi tahu Anda bagaimana monitor akan bereaksi untuk menghentikan proses.
tandai
Tampaknya berfungsi sempurna dengan systemd, layanan masih menunjukkan berjalan baik sebelum rotasi log berlangsung. Dan saya berasumsi jika pid tertentu yang saya hentikan, akankah proses anak pid terus berjalan?
Joseph Persie
1

Anda dapat mencoba untuk membiarkan log aplikasi ke pipa bernama dan memiliki beberapa program (misalnya syslog-ng ) yang mendukung mekanisme rotasi log yang tepat membaca entri log dan mencatatnya ke file.

vwegert
sumber