log4perl从另一个包中运行,不会触发通过电子邮件发送的邮件

时间:2015-12-03 15:34:56

标签: perl log4perl

我在看到使用log4perl通过电子邮件发送邮件时无法解释的行为。

因此,以下测试脚本工作正常,并且发送的电子邮件没有问题:

#!/usr/bin/perl
use strict;
use warnings;
use Log::Log4perl qw(:easy);
use Log::Dispatch;

my $appender_email = Log::Log4perl::Appender->new(
    "Log::Dispatch::Email::SSMTP",
    threshold => "INFO",
    to => 'myemail@mail.com',
    subject => 'Perl script message'
);

my $email_logger = get_logger();
$email_logger->level($INFO);
$email_logger->add_appender($appender_email);

$email_logger->info('hi');

Log::Dispatch::Email::SSMTP是我编写的用于使用ssmtp命令发送电子邮件的模块。

当这个相同的代码被移动到与我原始脚本相同的目录中的另一个文件中的另一个包时,奇怪就开始了。当我这样做并在原始脚本中使用该包时,不会发送任何电子邮件,也不会抛出任何错误。

但是,如果我改变:

Log::Dispatch::Email::SSMTP

Log::Log4perl::Appender::Screen

打印出" hi"当我运行我的脚本时,屏幕就好了。

因此,如果在将消息发送到屏幕时log4perl正常工作,为什么在尝试发送电子邮件时它不起作用?为什么相同的代码会从原始脚本中发送电子邮件而不是从包中发送?同样,没有错误被抛出或任何迹象表明出现了问题。我已经验证我的模块加载了print语句。所以我的模块代码肯定会被加载,但电子邮件仍然没有被解雇。

更新 以下是在评论中每个请求 时的代码。

maillog.pl

#!/usr/bin/perl
BEGIN { unshift @INC, "/home/steve/perl/perl-lib" }
use strict;
use warnings;
use Testy;

print 'start' . "\n";

以下是Testy.pm包:

package Testy;
BEGIN { unshift @INC, "/home/steve/perl/perl-lib" }
use strict;
use warnings;
use Log::Log4perl qw(:easy);
use Log::Dispatch;

print 'end' . "\n";
my $appender_email = Log::Log4perl::Appender->new(
    "Log::Dispatch::Email::SSMTP",
    #"Log::Log4perl::Appender::Screen",
    threshold => "INFO",
    to => 'myemail@mail.com',
    subject => 'Perl script message'
);

my $email_logger = get_logger();
$email_logger->level($INFO);
$email_logger->add_appender($appender_email);

$email_logger->info('hi');

1;

以下是位于SSMTP的<{1}}模块:

/home/steve/perl/perl-lib/Log/Dispatch/Email/SSMTP

当我运行package Log::Dispatch::Email::SSMTP; use strict; use warnings; use Log::Dispatch::Email; use Data::Dumper; use base qw( Log::Dispatch::Email ); print "hi, i'm here!\n"; sub send_email { my $self = shift; my %p = @_; my $to = escape ( join ',', @{$self->{to}} ); my $subject = $self->{subject}; my $message = $p{message}; $message =~ s/'/'\\''/g; print $to . "\n"; print $subject . "\n"; print $message . "\n"; print "I'm working!"; system("echo 'To: $to\nFrom: \'Me\' <myemail\@gmail.com>\nSubject:$subject\n\n$message' | /usr/sbin/ssmtp $to"); } sub escape { my $address = shift; $address =~ s/@/\\@/g; return $address; } 1; 时,使用./maillog.pl包中的代码时不会发送任何电子邮件(Testy文件中的代码相同。但是,如果我取消注释{{1}并用maillog.pl代替它。

更新#2 如果我将Log::Dispatch::Email::SSMTP更改为Log::Log4perl::Appender::Screen,它也可以正常运行。所以也许会出现Log::Log4perl::Appender::Screen中的一些错误?

1 个答案:

答案 0 :(得分:0)

click here

的常见问题解答中找到了一些问题

显然,有一些缓冲正在进行,因此在达到生成的消息数量的某个阈值之前,不会立即发送电子邮件。虽然当代码在main包中时,为什么会立即发送电子邮件,这仍然是个谜。

所以这里的代码适用于buffered属性设置为0:

my $appender_email = Log::Log4perl::Appender->new(
    "Log::Dispatch::Email::SSMTP",
    threshold => "INFO",
    to => 'me@mymail.com',
    buffered => 0,
    subject => 'Perl script message'
);