在Dancer中重定向和恢复STDERR

时间:2016-09-19 08:41:34

标签: perl stdout stderr io-redirection dancer

启动http server时,我不希望在>> Dancer2 v0.201000 server <pid> listening on http://0.0.0.0:<port>上看到stderr。这就是我在调用start()

之前添加以下行的原因
get "/pwd" => sub {
    my $pwd = cwd;
    print STDERR "\n\n[PWD] : $pwd\n"; # this line is not being printed
    print "\n\n[STDOUT::PWD] : $pwd\n";
    my %responseHash = ( pwd => $pwd );
    my $response = encode_json \%responseHash;
    return $response;
};    

my $dancerStartErr;

sub startServer {
    open (local *STDERR, ">", \$dancerStartErr) 
        or die "Dup err to variable error: $!\n";

    start();
}

startServer();

问题是以后我无法在STERR上打印。如何重新开启STDERRopen(STDERR, ">", \*STDERR);没有帮助?)

2 个答案:

答案 0 :(得分:2)

如果您不希望应用程序记录任何内容,可以将日志记录引擎更改为使用Dancer2::Logger::Null。您可以通过编辑 config.yml 或在您的某个环境中执行此操作。例如,要在producion中将其关闭,请更改#appdir / environments / production.yml

logger: 'null'

默认情况下是日志引擎'console',它会将内容打印到您的终端。

还有其他的Dancer2 :: Logger ::类bundled with Dancer2和CPAN in their own distributions。将所有内容转储到黑洞中的更好解决方案可能是登录到文件。有关如何进一步配置的文档可以在Dancer2::Core::Role::Logger

中找到

另请注意,您应该使用具有相应日志级别的日志记录关键字,而不是在代码中打印到STDERR

print STDERR "\n\n[PWD] : $pwd\n"; # this line is not being printed

这不是一个好主意,因为你无法区分这是一个错误,一个警告,还是只是调试输出。这就是为什么Dancer2中内置了不同的日志级别。

  • core
  • debug
  • info
  • warning
  • error

所有这些都可以作为关键字使用。在Dancer2::Manual中有关于它的文档。

由于工作目录可能与生产无关,但仅在开发期间,您可以使用debug

debug "[PWD] : $pwd";

就是这样。它会自动处理换行等问题。

答案 1 :(得分:0)

您可以在重定向之前使用select将其保存在变量

my $oldfh = select(STDERR);

然后再使用

select($oldfh);

同时退房: