2009-08-12 12 views
5

सबसे पहले, मैं सभी अप्राप्य अपवादों के लिए रन टाइम अपवाद फेंक रहा हूं, इससे इन अपवादों को कंटेनर तक यात्रा करने का कारण बनता है, जहां मैं वर्तमान में एक त्रुटि पृष्ठ (web.xml में परिभाषित) का उपयोग करता हूं। इस त्रुटि पृष्ठ में एक स्क्रिप्टलेट है जो लॉगर को आमंत्रित करता है।जावा ईई वेब ऐप्स में हर अपवाद को पकड़ना

मेरे साथ यह मुद्दा यह है कि इस आमंत्रण पर अपवाद अब ढेर पर नहीं है। मेरे पास अनुरोध स्कोप चर ("javax.servlet.error.message") से इसकी पहुंच है। यह स्ट्रिंग स्टैक ट्रेस है। मुझे लॉगिंग उद्देश्यों के लिए स्पष्ट रूप से लॉग इन करने के लिए इस स्टैक ट्रेस की आवश्यकता है, और अलग-अलग ऐप सर्वरों पर "javax.error_message" को सुरक्षा कारणों से बंद कर दिया जा सकता है .......

तो मेरा सवाल यह है कि, रनटाइम अपवादों को सर्वोत्तम तरीके से कैसे लॉग किया जा सकता है जावा ईई ऐप्स के भीतर इसमें सबकुछ लपेटे बिना:

try {} catch (Exception e) {logger.log(...)} 

?

मैं कंटेनर से लॉगर को आक्रमण करने का कोई तरीका चाहता हूं ... कंटेनर उदाहरण के लिए अपवाद को पकड़ने से ठीक पहले।

+0

आप किस ढांचे का उपयोग कर रहे हैं? Struts? वसंत? –

+0

यह ढांचा ढांचा होगा। हम नहीं चाहते हैं कि यह विशेष रूप से किसी भी चीज़ से जुड़ा हो (ऐप सर्वर या फ्रेमवर्क)। हम वास्तव में 3 ढांचे का समर्थन कर रहे हैं। ये सादा j2ee/struts/JSF हैं (विशेष रूप से ओरेकल के जेएसएफ के अनुकूलन: एडीएफ चेहरे)। पिछली छोर के लिए, पीएल/एसक्यूएल संग्रहीत प्रक्रियाओं या सिर्फ एसक्यूएल/जेडीबीसी ... एडीएफ चेहरे के लिए, यह एडीएफ बिजनेस घटकों का उपयोग करता है ... जो टॉपलिंक के समान है। – Zombies

उत्तर

3

पर एक नजर डालें।

try { 
    chain.doFilter(req,resp); 
} catch (Exception e) { 
    logger.error("", e); 
    throw new RuntimeException(e); 
} 

यह अब तक ठीक काम करता है और एक विशेष ढांचे या अनुप्रयोग सर्वर पर निर्भर नहीं है: एक प्रतिक्रिया फिल्टर जोड़ने और chain.doFilter (अनुरोध, resp) इसलिए की तरह लपेटकर द्वारा।

1

ऐसा करने के लिए सर्वलेट एपीआई में मुझे कुछ भी पता नहीं है।

हालांकि, आप इसे टॉमकैट में एक उदाहरण श्रोता के साथ कर सकते हैं। आप इस तरह context.xml में InstanceEvent.AFTER_SERVICE_EVENT घटना सही होने के बाद कंटेनर अपवाद पकड़ता एक श्रोता स्थापित कर सकते हैं,

<InstanceListener>myapp.MyListener</InstanceListener> 

बिलाव आग और इससे पहले कि यह अपवाद फिर से फेंकता है। आप वहां लॉगजर का आह्वान कर सकते हैं।

+0

क्या आप जानते हैं कि यह ओरेकल वेबलॉगिक या ओरेकल एप्लिकेशन सर्वर में किया जा सकता है? – Zombies

+0

अन्य कंटेनरों के साथ कोई अनुभव नहीं। यह बहुत संभावना है कि उनके पास कुछ समान (शायद अनियंत्रित) है क्योंकि कंटेनर को अपने जीवन चक्र प्रबंधन के लिए हुक की जरूरत है। –

+0

ऐसा लगता है कि ओरेकल जेएसएफ के माध्यम से इसके लिए अनुमति देता है, जहां हम अपने एडीएफ चेहरे (ओरेकल से जेएसएफ कार्यान्वयन) पर ऐसा करेंगे: http://database.in2p3.fr/doc/oracle/Oracle_Application_Server_10_Release_3/web.1013 /b28967/web_val008.htm – Zombies

0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन 'अपवाद' ऑब्जेक्ट एक चर के रूप में मौजूद है .. आपके 'त्रुटि' jsp में 'अपवाद' कहा जाता है। अपवाद जानकारी पुनर्प्राप्त करने और त्रुटि jsp में लॉग इन करने के लिए आप हमेशा इस ऑब्जेक्ट का उपयोग कर सकते हैं।

0

AOP (Aspect Oriented Programming) मेरी पहली पसंद होगी।

आप को परिभाषित:

  • बिंदु में शामिल होने के (एक क्रम अपवाद फेंक दिया जाता है)।
  • सलाह (अपवाद लॉग करने के लिए आपका कोड)।
  • बिंदु कटौती (आपके अनुप्रयोगों के कौन से हिस्से इस पहलू को "सुन रहे हैं")।

मैं एक समाधान पाया http://www.aspectj.org/

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