2014-02-06 3 views
1

Ситуация: работа 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"; 
+0

Это может помочь, если вы покажете код, который генерирует журналы. – ThisSuitIsBlackNot

+0

Извините, должно быть, было более ясно ... можете ли вы показать ~ 10 строк кода, которые вы использовали для тестирования? Это было бы более полезно, поскольку я предполагаю, что это полная программа, которая воспроизводит проблему, а не только изолированную подпрограмму, которую никто кроме вас не мог бы запустить. – ThisSuitIsBlackNot

+0

Весь мой тестовый код вызывает эту функцию для настройки файлов журнала, а затем использует функцию «-> error (« some output here »). Он работает через оболочку, но не cron. – ethrbunny

ответ

2

FWIW: Это кажется, что я играл «быстро и свободно» с Log4perl в течение многих лет. Что-то обновилось, и потребность в инициализации библиотеки начала применяться.

Короткий ответ: необходимо позвонить по телефону Log::Log4perl->easy_init($DEBUG);, прежде чем позвонить по телефону get_logger(). Затем добавьте свои приложения (на любом уровне, который вы хотите), и вы должны быть хорошими.

Смежные вопросы