Вопрос: Поворот журналов немого неинтерактивного приложения


Сервер Ubuntu 10.4.

У меня есть немой неинтерактивный унаследованный сервис, который постоянно работает на моем сервере.

Он записывает свой журнал в файл с фиксированным именем (/var/log/something.log).

Он не обрабатывает никаких сигналов, чтобы отпустить файл журнала. Мне нужно повернуть этот файл журнала.

Есть ли способ сделать это правильно, не меняя приложение и не теряя никаких данных в журнале?


8
2017-10-10 11:17


Источник




Ответы:


Ответ Игнасио заинтриговал меня, поэтому я провел некоторое исследование и придумал сценарий Perl ниже. Если ваша служба будет писать в именованный канал, она должна работать и использоваться с logrotate.

Чтобы он работал, вам нужно сделать свой файл журнала в именованный канал. Переименуйте существующий файл, затем

mkfifo /var/log/something.log

и отредактировать 3 имени файла в соответствии с вашими требованиями. Запустите службу, а затем этот демон, который должен прочитать именованный канал и записать его в новый файл журнала.

Если вы переименуете /var/log/somethingrotateable.log затем отправьте HUP демону, он будет сам появляться и создать новый somethingrotateable.log написать. При использовании logrotate a postrotate сценарий kill -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;
   }
}

5
2017-10-10 11:45





Войдите в FIFO, затем запустите демон, который подключается к другой стороне FIFO и имеет обработчики сигналов, которые позволяют вам вращать журнал.


7
2017-10-11 16:00





Отправьте SIGSTOP в процесс, скопируйте журнал на другое имя, обрезайте журнал, отправьте SIGCONT в процесс, возможно, вот так:

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

Вы также можете использовать logrotate для магии для вас с тщательно обработанными сценариями до и после ротации и параметром copytruncate, например:

/ var / log / something {
    ежедневно
    повернуть 5
    copytruncate
    prerotate
        # Это предполагает, что у вас есть файл pid, конечно.
        # Если вы этого не сделаете, вместо этого это может быть pkill, как указано выше.
        kill -STOP `cat / var / run / legacyappname.pid`
    endscript
    postrotate
        kill -CONT `cat / var / run / legacyappname.pid`
    endscript
}

2
2017-10-10 11:50



Интересный вариант, спасибо. Что произойдет с подключением сокетов к приложению и от него во время остановки? Я беспокоюсь о разъединениях. - Alexander Gladysh
Кроме того, приложение запускается под runit. Что сделает его монитор, если процесс приложения будет остановлен? - Alexander Gladysh
Поведение соединений будет зависеть от тайм-аута, с которым они установлены, и времени, необходимого для фактического вращения. Я бы не подумал, что вы столкнетесь с какой-либо проблемой, если журналы не будут огромными. У меня нет опыта работы с runit, поэтому я не могу сказать, как монитор отреагирует на остановку процесса. - mark
Кажется, что он отлично работает с systemd, сервис по-прежнему показывает, что он работает до того, как произошел поворот журнала. И я предполагаю, что если бы какой-то конкретный pid я останавливал, будут ли продолжаться процессы дочернего процесса pid? - Joseph Persie


Вы можете попытаться разрешить журналу приложения названная труба и иметь некоторую программу (например Syslog-нг), который поддерживает правильные механизмы вращения журнала, считывает записи журнала и записывает их в файл.


1