【问题标题】:Redirect and Restore STDERR in Dancer在 Dancer 中重定向和恢复 STDERR
【发布时间】:2017-01-26 21:16:25
【问题描述】:

开始我的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); 没有帮助)?

【问题讨论】:

  • 您要禁用所有日志记录,还是只禁用第一条消息?

标签: perl stdout stderr io-redirection dancer


【解决方案1】:

如果您不希望您的应用程序记录任何内容,您可以将记录引擎更改为使用Dancer2::Logger::Null。您可以通过编辑您的 config.yml 或在您的其中一个环境中来做到这一点。例如,要在生产中关闭它,请更改 # 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";

就是这样。它会自动为您处理换行符等。

【讨论】:

    【解决方案2】:

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

    my $oldfh = select(STDERR);
    

    以后再用

    select($oldfh);
    

    也可以看看:

    【讨论】:

    • 我添加了一个全局变量$STDERR_COPY,然后尝试使用my $stdErr = select($STDERR_COPY); 打印到stderr,然后我尝试在stderr 上打印我得到Can't use string ("main::STDERR") as a symbol ref while "strict refs"
    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2014-07-22
    • 2017-07-21
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多