Если ни одна из программ ротации журналов, предложенных @ ente`, не доступна / работает, рассмотрите возможность прокрутки своей собственной.
Если объем сообщений с сервера узла i низкий (несколько сообщений в минуту) , скрипт bash
(пример ниже) подойдет. Если объем большой, рассмотрите возможность использования более мощного движка (Perl, python) или программы ac / c ++ для большого объема.
Использование bash
для малого объема, проверка на изменение даты каждый раз 60 секунд, чтобы избежать дорогих звонков на сегодняшний день. Формат файла журнала можно изменить, изменив команду date.
#! /bin/bash -ue
function dynamic_logger {
local date_fmt='/tmp/logfile-%Y-%m-%dT%H:%M'
local curr_log=$(date +"$date_fmt")
echo "Start LOG $curr_log" >&2
exec 1>>$curr_log
local last_ts=$SECONDS
while read l ; do
now=$SECONDS
if ((now-last_ts>60)) ; then
last_ts=$now
next_log=$(date +"$date_fmt")
if [[ "$next_log" != "$curr_log" ]] ; then
curr_log=$next_log
echo "Change LOG $curr_log" >&2
exec 1>>$curr_log
fi
fi
printf '%s\n' "$l"
done
}
node something.js 2>&1 | dynamic_logger
Для повышения производительности рассмотрите эквивалентный сценарий perl
. Он принимает формат strftime
в качестве входных данных. Сохранить как "my-log" и выполнить с
node javascript.js 2>&1 | my-log
#! /usr/bin/perl
use strict ;
use POSIX qw(strftime) ;
my $log_fmt = shift @ARGV ;
my $last_ts = time ;
my $curr_log = strftime($log_fmt, localtime) ;
open STDOUT, '>>', $curr_log or die ;
print STDERR "Start Log: $curr_log\n" ;
while ( <> ) {
my $now = time ;
if ( $now-$last_ts > 10 ) {
$last_ts = $now ;
my $next_log = strftime($log_fmt, localtime) ;
if ( $next_log ne $curr_log ) {
$curr_log = $next_log ;
open STDOUT, '>>', $curr_log or die ;
print STDERR "Change Log: $curr_log\n" ;
} ;
print $_;
} ;
} ;