2016-09-19 43 views
4

當我開始我的http server時,我不想看到>> Dancer2 v0.201000 server <pid> listening on http://0.0.0.0:<port>印在stderr上。這就是爲什麼我呼籲start()重定向和恢復舞者的STDERR

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);沒有幫助)?

+0

是否要禁用所有日誌記錄,或只是第一條消息? – simbabque

回答

2

如果您不希望自己的應用程序記錄任何內容,則可以將記錄引擎更改爲使用Dancer2::Logger::Null。你可以編輯你的config.yml,或者在你的一個環境中。例如,要在producion中將其關閉,請更改#appdir/environments/production.yml

logger: 'null' 

默認爲日誌引擎'console',打印的東西到你的終端。

還有其他Dancer2 :: Logger :: classes available 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"; 

就是這樣。它會自動處理換行符等。

0

你可以重定向將其保存在一個變量

my $oldfh = select(STDERR); 

使用前select,然後使用它以後

select($oldfh); 

還檢查了:

+0

我添加了一個全局變量'$ STDERR_COPY',然後嘗試用'my $ stdErr = select($ STDERR_COPY);'打印到stderr,然後我嘗試在'stderr'上打印我得到'不能使用字符串( 「main :: STDERR」)作爲符號ref,而「strict refs」' –