Como prometido, um "próximo o suficiente" para o programa de buffer de anel, em algumas linhas de Perl.
Para usá-lo, passe o tamanho dos arquivos de log desejados, em bytes (mais ou menos uma linha) e dois ou mais arquivos de log. Vai alternar entre os arquivos de log a cada X bytes. Tenho certeza de que já existe um programa para fazer isso, mas não consegui encontrá-lo com uma pesquisa rápida. Por exemplo,
$ your-app | log-splitter 1048576 /var/log/your-app/log1 /var/log/your-app/log2
assumindo, é claro, que o arquivo log-splitter
é executável, em $ PATH, e contém:
#!/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;
Para esclarecer dúvidas sobre o código:
To the extent possible under law, Anthony DeRobertis has waived all copyright and related or neighboring rights to the above program (log-splitter). This work is published from: United States.