2013-06-28 29 views
0

原來的問題已經被改寫,要明確供以後使用爲什麼Log4perl PatternLayout中的%M和%F在特殊情況下有所不同?

我發現下面的問題是怪異。在某些情況下,%M和%F表示不同的文件。例如詮釋下面的情況:

Foo.pm包含

use warnings; 
sub x { 2; 1; } 
1; 

test.pl包含

#!/usr/bin/perl 
use Log::Log4perl qw/:easy/; 
Log::Log4perl->easy_init({ file => 'STDOUT', layout => '[%p{1}] %m{chomp} [%l]%n' }); 
$::log = Log::Log4perl->get_logger; 
local $SIG{__WARN__} = sub { 
    local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; 
    $::log->warn(shift); 
}; 
require "Foo.pm"; 

的結果是:

[W] Useless use of a constant in void context at Foo.pm line 2. [main:: Foo.pm (2)] 

所以文件「Foo.pm「,但功能是」main ::「。

我發現奇怪的行爲與「require」編譯時發生的錯誤/警告有關。

爲什麼%M和%F有區別?

感謝,FERcsI

+0

什麼perl的版本? – ysth

+0

只是一個小的擴展:其實$ SIG {__ WARN__}使用$ log-> warn和$ SIG {__ DIE__}使用$ log->錯誤,但是那裏的藝術沒有更多的區別... – FERcsI

+0

我使用的Perl版本是5.16 ... – FERcsI

回答

0
%F File where the logging event occurred 
    %M Method or function where the logging request was issued 
+0

謝謝。我讀過POD,只是這不能解釋「警告」和「錯誤」之間的區別...... – FERcsI

0

最後,我找到了答案,以我自己的問題,通過一些實驗。

PatternLayout使用「調用者」條目的文件名(和行號等)。但是,方法名稱有點複雜。在通常情況下,方法名稱也可用於「調用者」的下一級別(同一級別包含ANON)。但是,在一些特殊的eval(例如請求)情況下,必須完成「調用者」中的多級搜索。

此外,請求在導入的文件中沒有「子程序」,因此%M返回包含請求的函數,但文件名和行號沒有指向包含的文件。

作爲一個副作用,你是不是能夠使用要求的調用者水平:要求的行號處於無法訪問的「caller_depth」任何級別(而不是「主叫」)...

相關問題