2010-10-15 16 views
7

मैं die संदेशों को एक अलग फ़ाइल में रीडायरेक्ट करना चाहता हूं ताकि मैं यह निर्धारित करने के लिए बाद में उस फ़ाइल की तुलना कर सकूं कि क्या गलत हुआ।मैं पर्ल में फ़ाइल में मरने के फ़ंक्शन के आउटपुट को रीडायरेक्ट कैसे कर सकता हूं?

लेकिन इस कोड मुझे देता है त्रुटियों:

$ cat test.pl 
use strict; 
use warnings; 

my $log = "msglog.log"; 
die $log "DEAD$!"; 

$ perl test.pl 
Missing comma after first argument to die function at test.pl line 5, near ""DEAD$!";" 
Execution of test.pl aborted due to compilation errors. 
$ 

मैं फोन करने वाले से 2> करने के लिए नहीं करना चाहती। क्या उन्हें स्क्रिप्ट के भीतर से रीडायरेक्ट करने के लिए कोई रास्ता है?

उत्तर

9

पर्ल का dieSTDERR पर प्रिंट करता है ताकि आप STDERR को फ़ाइल में रीडायरेक्ट कर सकें।

#!/usr/bin/env perl 
# the path above depends on your system 

open(STDERR, ">>", "errlog.log"); 
die "Hello"; 
+1

यह चेतावनी() संदेश, चेतावनियां, और STDERR को मुद्रित कुछ और भी पुनर्निर्देशित करता है। इतना ही नहीं, अगर किसी ने __DIE__ हैंडलर को फिर से परिभाषित करके इसे ठीक से किया है, तो यह मर() संदेशों को भी पुनर्निर्देशित नहीं कर सकता है। –

12

आप "मरने" से पहले चलाने के लिए $SIG{__DIE__} हैंडलर इंस्टॉल कर सकते हैं। हैंडलर त्रुटि संदेश जो आप लॉग इन कर सकते के साथ बुलाया जाएगा:

local $SIG{__DIE__} = sub { 
    my ($message) = @_; 
    # log the message   
}; 

जानकारी के लिए perlvar में $SIG{expr} देखें।

+0

+1, मेरी विधि से काफी बेहतर/अधिक लचीला। – birryree

9

Log::Log4perl मॉड्यूल कुछ विकल्पों से अधिक प्रदान करता है।

कोई भी एसटीडीईआरआर और लॉगफाइल दोनों में त्रुटि संदेश आउटपुट का चयन कर सकता है।

my $logger = Log::Log4perl->init ('log.conf'); 
# Configuration file controls what to output, like time, line number, class... 

$logger->get_logger ('Hello::World'); # Define which class logger to use 

. 
. 
. 

open my $fh, '<', $file 
    or $logger->logdie ("Log the demise: $!"); # ... and die; 

हालांकि इसे सेटअप के मामले में थोड़ा और प्रयास की आवश्यकता है, इसकी लचीलापन संभावित संभावनाओं को अनलॉक करती है।

संबंधित मुद्दे

 संबंधित मुद्दे