log4j

2010-02-26 22 views
19

का उपयोग कर जावा में लॉग रनटाइम अपवाद, मैं वर्तमान में टॉमकैट, स्प्रिंग और जावा का उपयोग कर एक एप्लिकेशन बना रहा हूं। मैं अपनी लॉगिंग लाइब्रेरी के रूप में Log4J का उपयोग कर रहा हूं। मैं वर्तमान में पाठ फ़ाइल में सबकुछ लॉगिंग कर रहा हूं। मेरे पास होने वाले मुद्दों में से एक यह है कि RuntimeExceptions किसी भी फाइल को लॉग इन नहीं किया जा रहा है। मैं सोच रहा था कि क्या RuntimeExceptions लॉग इन करने का कोई तरीका है जो शायद मेरी एप्लिकेशन लॉग फ़ाइल में फेंक दिया गया हो। यदि नहीं, तो यह किसी अन्य लॉग फ़ाइल में लॉग इन करना संभव है? क्या ऐसा करने का कोई मानक तरीका है? यदि ऐसा है तो टॉमकैट के भीतर अपना आवेदन चलाते समय ऐसा करने का एक मानक तरीका है?log4j

आपकी मदद के लिए अग्रिम धन्यवाद!

+2

क्या आपका मतलब है "ध्यान में न आया" RuntimeExceptions? –

+0

हां मेरा मतलब है "बेकार" रनटाइम अपवाद – DkS

उत्तर

21

मुझे यकीन नहीं है कि यह वही है जो आप खोज रहे हैं, लेकिन अपवादों के लिए एक हैंडलर है जो धागे को समाप्त करता है। यह किसी भी अपवाद के लिए एक हैंडलर है जो धागे के लक्ष्य से स्पष्ट रूप से पकड़ा नहीं जाता है।

डिफ़ॉल्ट "न आया हुआ अपवाद हैंडलर" बस System.err को स्टैक ट्रेस मुद्रित करने के लिए Throwable पर printStackTrace() कहता है। हालांकि, अगर आप कर सकते थे replace अपनी खुद की UncaughtExceptionHandler कि अपवाद लॉग बजाय log4j के साथ इस:

class Log4jBackstop implements Thread.UncaughtExceptionHandler { 

    private static Logger log = Logger.getLogger(Log4jBackstop.class); 

    public void uncaughtException(Thread t, Throwable ex) { 
    log.error("Uncaught exception in thread: " + t.getName(), ex); 
    } 

} 

आप एक निष्पादक ढांचे का उपयोग कर रहे हैं, तो करने के लिए जो आपको एक Runnable वस्तु गुजरती हैं, इसके धागे शायद अपने स्वयं के catch ब्लॉक को रोकने के लिए है बेजोड़ अपवाद हैंडलर तक पहुंचने से अपवाद। तुम वहाँ Runtime अपवाद को पकड़ने के लिए चाहते हैं, एक तरह से करने के लिए वह इस तरह का प्रवेश आवरण में प्रत्येक कार्य रैप करने के लिए, यह है:

class Log4jWrapper { 

    private final Logger log; 

    private final Runnable target; 

    Log4jWrapper(Logger log, Runnable target) { 
    this.log = Objects.requireNonNull(log); 
    this.target = Objects.requireNonNull(target); 
    } 

    public void run() { 
    try { 
     target.run(); 
    } catch(RuntimeException ex) { 
     log.error("Uncaught exception.", ex); 
     throw ex; 
    } 
    } 

} 

... 

Runnable realTask = ...; 
executor.submit(new Log4jWrapper(Logger.getLogger(Whatever.class), realTask)); 
+0

क्या यह सामान्य रूप से अनुप्रयोगों में यह रनटाइम अपवादों को संभाला जाता है? मुझे लगता है कि मैं सोच रहा हूं कि यह इस से निपटने का एक मानक तरीका है। – DkS

+0

इसके अलावा मैं स्प्रिंग एपीआई से थ्रेडपूल टास्क एक्सक्लूसर का उपयोग कर रहा हूं, क्या यह अभी भी कुछ है जो इस कक्षा का उपयोग करके किया जा सकता है? – DkS

+0

रननेबल पर रनटाइम अपवाद होने पर यह बहुत अच्छा काम करता है, हालांकि थ्रेडपूल टास्क एक्सप्लोरर के साथ अपवाद होने पर क्या होगा? मान लें कि यह RunTimeException फेंकता है क्योंकि पूल को सही तरीके से कॉन्फ़िगर किया गया था .... यह अभी भी कंसोल पर प्रिंट होगा और लॉग इन नहीं होगा .... कोई सुझाव? – DkS

1

आप अपने लॉगर का उपयोग करने के लिए StdErr को रीडायरेक्ट करने का प्रयास कर सकते हैं। यह आपके std err में लिखे गए किसी भी चीज़ के परिणाम को आउटपुट करना चाहिए (जिसमें अनचाहे अपवाद शामिल होना चाहिए)

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

https://blogs.oracle.com/nickstephen/entry/java_redirecting_system_out_and

12

एक तरह से ध्यान में न आया RuntimeExceptions (या उस बात के लिए किसी भी ध्यान में न आया Throwables) लॉग इन करने के एक वर्ग है कि Thread.UncaughtExceptionHandler लागू करता है बनाने के लिए है। इस वर्ग की uncaughtException() विधि लॉग में अपवाद विवरण लिखती है। आप JVM कॉल इस अपवाद संचालक जब भी ध्यान में न आया RuntimeException अपने कोड में लाइन

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler()); 

जोड़कर एक धागा समाप्त हो जाता है कर सकते हैं।

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