2014-04-24 98 views
1

我想爲一個線程腳本實現一些日誌記錄功能,並且遇到了File::Tee。但是,當試圖在Windows盒子上嘗試ppm模塊時,找不到它(並且根據activestate,在Windows上不支持)。線程安全的替代File :: Tee?

我真的很喜歡,你可以鎖定文件的訪問,雖然,通過執行類似:

tee STDOUT, {mode => '>>', open => '$ENV{DOM}\\threaded_build.log', lock => 1}; 
tee STDERR, {mode => '>>', open => '$ENV{DOM}\\threaded_debug.log', lock => 1}; 

是否有一個跨平臺的,線程安全的替代方案?

回答

3

File::Tee需要格外小心處理通過system或未通過perlio的XS代碼運行的外部程序生成的輸出。我認爲這就是它與Windows不兼容的原因。

IO::Tee是更跨平臺的,我不認爲使其線程安全將是很難做到。 The sync code in File::Tee只是看起來像:

    flock($teefh, LOCK_EX) if $target->{lock}; 
        print $teefh $cp; 
        flock($teefh, LOCK_UN) if $target->{lock}; 

你可以通過修改兩個方法實現在IO::Tee同樣的事情:

use Fcntl ':flock'; 

no warnings 'redefine'; 
sub IO::Tee::PRINT 
{ 
    my $self = shift; 
    my $ret = 1; 
    foreach my $fh (@$self) { 
     flock($fh, LOCK_EX); 
     undef $ret unless print $fh @_; 
     flock($fh, LOCK_UN); 
    } 
    return $ret; 
} 
sub IO::Tee::PRINTF 
{ 
    my $self = shift; 
    my $fmt = shift; 
    my $ret = 1; 
    foreach my $fh (@$self) { 
     flock($fh, LOCK_EX); 
     undef $ret unless printf $fh $fmt, @_; 
     flock($fh, LOCK_UN); 
    } 
    return $ret; 
} 
+0

嗯,所以我開始實施,但是當我做'PPM安裝IO- Tee'我得到'ppm安裝失敗:找不到任何提供IO-Tee的軟件包' – MrDuk

+0

這很令人失望 - 'IO :: Tee'已經有一段時間了,它與Windows兼容。不管。它也是一個帶有單個文件的純perl模塊,[所以你可以將它複製](http://cpansearch.perl.org/src/KENSHAN/IO-Tee-0.64/Tee.pm)到你的系統庫文件夾中。 – mob

+0

謝謝!我知道這是對原始問題的補充,但你確實聲明它是'my $ tee = IO :: Tee-> new(\ * STDOUT,「$ ENV {PATH} \\ build.log」);'然後只要做'打印$ tee'東西「;',對吧? – MrDuk