Ситуация: работа cron, работающая в 1 утра в течение 5 лет. Создает основной журнал и сотни поддиалогов (потянув данные из удаленных мест).Log4perl - работал - теперь файлы с нулевой длиной
Начиная с 12/31: вместо обычных файлов 200 КБ они теперь 0Kb. Работа по-прежнему работает так, как должно, но данные журнала не генерируются. Все поддиалоги созданы, но также являются 0Kb.
Если работа выполняется через интерактивную оболочку, она работает нормально.
То, что я смотрел на:
- без ошибок в журнале хрон
- нет ошибок в системном журнале
- сравнили выходные «ENV» с хрон и интерактивной оболочки - нет различий
- никаких обновлений для YUM или CPAN
- В файловой системе более чем достаточно места
Я сократил свои тесты примерно до 10 строк кода - запустил, установил журналы, записывал в журналы и выходил на стандартный вывод. Stdout дает мне то, что я ожидаю в любом случае (pipe stdout и stderr для файла). Файлы журнала имеют только контент, который запускается через интерактивную оболочку.
Что я пропустил?
Система работает сервер 5.x RHEL (x64)
EDIT: Это как лог-файлов appenders настроены:
sub initLogging
{
my $self = shift;
my $logFileInfo = shift;
my $dataDir = $self->{ 'localDir' };
my $logger = get_logger("Home" . $self->{ 'homeId' });
my $appender = Log::Log4perl::Appender->new(
"Log::Log4perl::Appender::File",
filename => "${dataDir}/log/$logFileInfo.log");
my $layout = Log::Log4perl::Layout::PatternLayout->new("[%d{yyyy.MMM.dd HH:mm:ss Z}] %p %c - %m%n");
$appender->layout($layout);
$appender->threshold($INFO);
$logger->add_appender($appender);
my $appender0 = Log::Log4perl::Appender->new("Log::Log4perl::Appender::Screen",
name => 'screenlog',
stderr => 0);
$appender0->layout($layout);
$appender0->threshold($FATAL);
$logger->add_appender($appender0);
$self->{ 'logger' } = $logger;
}
Вызов программы:
#!/usr/bin/perl -w
use pull_common;
use DBI;
use strict;
print "start\n";
# build the main log file name
my @dt = localtime();
my $logFile = sprintf("justtesting-%04d%02d%02d-%02d%02d%02d", $dt[5] + 1900, $dt[4] + 1, $dt[3], $dt[2], $dt[1], $dt[0]);
my $common = new pull_common();
$common->{ 'homeId' } = 0;
$common->initLogging($logFile);
my $logger = $common->{ 'logger' };
$logger->info("this is a test. This is only a test. Remain calm.");
print "end\n";
Это может помочь, если вы покажете код, который генерирует журналы. – ThisSuitIsBlackNot
Извините, должно быть, было более ясно ... можете ли вы показать ~ 10 строк кода, которые вы использовали для тестирования? Это было бы более полезно, поскольку я предполагаю, что это полная программа, которая воспроизводит проблему, а не только изолированную подпрограмму, которую никто кроме вас не мог бы запустить. – ThisSuitIsBlackNot
Весь мой тестовый код вызывает эту функцию для настройки файлов журнала, а затем использует функцию «-> error (« some output here »). Он работает через оболочку, но не cron. – ethrbunny