2014-02-06 16 views
1

情況:cron作業已經在凌晨1點運行了大約5年。創建主日誌和數百個子日誌(從遠程位置提取數據)。Log4perl - 正在工作 - 現在長度爲零的文件

從12/31開始:而不是通常的200Kb文件,他們現在是0Kb。作業仍然按原樣工作,但沒有生成日誌數據。所有的子日誌都被創建,但也是0Kb。

如果通過交互式shell運行作業,它可以正常工作。

我已經看了:在cron日誌

  • 沒有錯誤
  • 在系統日誌中沒有錯誤
  • 已經比較了cron和交互shell輸出 'ENV' - 不存在
  • YUM或CPAN沒有更新
  • 文件系統有足夠的空間

我已將測試縮減爲約10行代碼 - 開始,安裝日誌,寫入日誌以及輸出並退出。在任何一種情況下,Stdout都給了我所期望的(管道標準輸出和標準錯誤文件)。日誌文件只有通過交互式shell運行時纔有內容。

我錯過了什麼?

系統運行RHEL 5.x的服務器(x64)的

編輯:這是日誌文件的appender是如何設置的:

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」)'函數。它通過shell而不是cron工作。 – ethrbunny

回答

2

FWIW:它似乎我在Log4perl多年來一直在玩'快速和鬆散'。一些東西得到更新,初始化庫的要求開始得到執行。

簡短回答:在致電get_logger()之前,請致電Log::Log4perl->easy_init($DEBUG);。然後添加你的appender(無論你想要的水平),你應該很好去。