Log4perl - 正在工作 - 现在是零长度文件

时间:2014-02-06 16:03:54

标签: perl cron

情况:cron工作已经凌晨1点运行了大约5年。创建主日志和数百个子日志(从远程位置提取数据)。

从12月31日开始:而不是通常的200Kb文件,它们现在是0Kb。作业仍然按预期工作但不生成日志数据。所有子日志都已创建,但也是0Kb。

如果作业是通过交互式shell运行的,那么它可以正常工作。

我看过的内容:

  • cron log中没有错误
  • 系统日志中没有错误
  • 比较了来自cron和交互式shell的'env'输出 - 没有差异
  • 没有更新YUM或CPAN
  • 文件系统有足够的空间

我已将测试减少到大约10行代码 - 启动,设置日志,写入日志以及stdout和退出。 Stdout给出了我在任何一种情况下的期望(管道标准输出和stderr到文件)。日志文件仅在通过交互式shell运行时具有内容。

我错过了什么?

系统正在运行RHEL 5.x服务器(x64)

编辑:这是日志文件追加器的设置方式:

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";

1 个答案:

答案 0 :(得分:2)

FWIW:看来我一直在玩“快速而宽松”。与Log4perl多年。有些东西得到了更新,初始化库的要求开始得到强制执行。

简答:在致电Log::Log4perl->easy_init( $DEBUG );之前,先致电get_logger()。然后添加你的appender(在你想要的任何级别),你应该很高兴。