Xoay vòng nhật ký của một ứng dụng không tương tác câm


8

Máy chủ Ubuntu 10.4.

Tôi có một dịch vụ kế thừa không tương tác ngu ngốc đang chạy liên tục trên máy chủ của tôi.

Nó đang ghi nhật ký của nó vào một tệp có tên cố định (/var/log/s Something.log).

Nó không xử lý bất kỳ tín hiệu nào để cho ra khỏi tệp nhật ký. Tôi cần phải xoay tập tin nhật ký đó.

Có cách nào để làm điều này đúng cách mà không thay đổi ứng dụng và không mất bất kỳ dữ liệu nào trong nhật ký không?

Câu trả lời:


5

Câu trả lời của Ignacio khiến tôi tò mò nên tôi đã thực hiện một số nghiên cứu và đưa ra kịch bản Perl bên dưới. Nếu dịch vụ của bạn sẽ ghi vào một đường ống có tên, nó sẽ hoạt động và có thể sử dụng được với logrotate.

Để nó hoạt động, bạn cần làm cho logfile của bạn thành một ống có tên. Đổi tên tập tin hiện có sau đó

mkfifo /var/log/something.log

và để chỉnh sửa 3 tên tệp để đáp ứng yêu cầu của bạn. Chạy dịch vụ của bạn sau đó daemon này sẽ đọc đường ống được đặt tên và ghi nó vào một logfile mới.

Nếu bạn đổi tên /var/log/somethingrotateable.logthì gửi HUP tới daemon, nó sẽ tự sinh ra và tạo một cái mới somethingrotateable.logđể viết. Nếu sử dụng logrotate một postrotatetập lệnh củakill -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;
   }
}

8

Đăng nhập vào một FIFO, sau đó chạy một daemon kết nối với phía bên kia của FIFO và có các trình xử lý tín hiệu cho phép bạn xoay nhật ký.


2

Gửi SIGSTOP cho quy trình, sao chép nhật ký sang tên khác, cắt ngắn nhật ký, gửi SIGCONT cho quy trình, có thể như thế này:

pkill -STOP legacyappname
cp /var/log/s Something.log /var/log/s Something.log.backup
cat / dev / null> /var/log/s Something.log
pkill -CON di sản

Bạn cũng có thể có logrotate làm điều kỳ diệu cho bạn với các kịch bản xoay trước và sau được tạo cẩn thận và tùy chọn copytruncate, như vậy:

/ var / log / cái gì đó {
    hằng ngày
    xoay 5
    bản sao
    đặc quyền
        # Điều này giả sử bạn có một tệp pid, tất nhiên.
        # Nếu bạn không, điều này thay vào đó có thể là một pkill như trên.
        giết -STOP `cat / var / run / legacyappname.pid`
    kết thúc
    postrotate
        giết -CONT `cat / var / run / legacyappname.pid`
    kết thúc
}

Lựa chọn thú vị, cảm ơn. Điều gì sẽ xảy ra với các kết nối ổ cắm với ứng dụng và từ nó trong quá trình dừng? Tôi lo lắng về việc ngắt kết nối.
Alexander Gladysh

Ngoài ra, ứng dụng đang được chạy dưới runit. Màn hình của nó sẽ làm gì nếu quá trình ứng dụng bị dừng lại?
Alexander Gladysh

Hành vi của các kết nối sẽ phụ thuộc vào thời gian chờ mà chúng được đặt và thời gian cần thiết để thực hiện xoay vòng thực tế. Tôi sẽ không tưởng tượng rằng bạn sẽ gặp rắc rối ở đó trừ khi các bản ghi là rất lớn. Tôi không có bất kỳ kinh nghiệm nào với runit vì vậy tôi không thể cho bạn biết màn hình sẽ phản ứng thế nào để dừng quá trình.
đánh dấu

Có vẻ hoạt động hoàn hảo với systemd, dịch vụ vẫn hiển thị như đang chạy tốt trước khi vòng quay nhật ký diễn ra. Và tôi đang giả sử nếu pid cụ thể mà tôi dừng lại, liệu các tiến trình con của pid có tiếp tục chạy không?
Joseph Persie

1

Bạn có thể thử để ứng dụng đăng nhập vào một ống có tên và có một số chương trình (ví dụ syslog-ng ) hỗ trợ các cơ chế xoay vòng nhật ký thích hợp đọc các mục nhật ký và ghi chúng vào một tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.