Как записать результат работающей программы в файл журнала, который будет менять имя каждый день (дата в имени файла)? - PullRequest
0 голосов
/ 10 января 2020

Я хочу знать, возможно ли использование командной строки linux для регистрации в файле с использованием текущего времени.

Допустим, я запускаю: node somescript.js > /tmp/logfile-DATE.log 2>&1 &

И каждый день, когда файл журнала изменит имя на новую дату.

Я бы действительно предпочел не кодировать логи логирования файлов c в программе.

Кстати, я в Ubuntu 18.

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 января 2020

Если ни одна из программ ротации журналов, предложенных @ 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 $_;

    } ;
} ;
0 голосов
/ 10 января 2020

Вы ищете что-то подобное?

node somescript.js > /tmp/logfile-`date "+\%a.log"` 2>&1 &

Вы можете заменить% a на любой, что вы хотите из команды date. \ Перед% есть, если вы хотите, чтобы он работал с cron. Это не нужно, если вы делаете это из командной строки.

...