2010-01-28 21 views
26

का उपयोग कर HttpServletResponse से लॉगिंग प्रतिक्रिया शरीर (एचटीएमएल) मैं लॉग इन करने की कोशिश कर रहा हूं (केवल सादगी के लिए लिखने के लिए कंसोल करने के लिए) अंतिम प्रस्तुत एचटीएमएल जिसे HttpServletResponse द्वारा वापस किया जाएगा। (अर्थात शरीर) इस उद्देश्य से, मैं तो जैसे वसंत MVC से HandlerInterceptorAdapter उपयोग कर रहा हूँ:स्प्रिंग एमवीसी हैंडलरइंटरसेप्टर एडाप्टर

public class VxmlResponseInterceptor extends HandlerInterceptorAdapter { 
    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
     System.out.println(response.toString()); 
    } 
} 

यह काम करता है के रूप में उम्मीद और मैं कंसोल में HTTP प्रतिसाद शीर्षलेख देखते हैं। मेरा सवाल यह है कि यदि संपूर्ण प्रतिक्रिया निकाय (यानी अंतिम प्रस्तुत एचटीएमएल) को कंसोल पर लॉग इन करने के लिए अपेक्षाकृत सरल तरीका है, तो प्रिंटवाइटर्स, आउटपुटस्ट्रीम और इसी तरह के कूदते जैक करने का सहारा लेना।

अग्रिम धन्यवाद।

+0

यह आमतौर पर की मदद से किया जाता है कंटेनर .... आप इसे किस में चला रहे हैं? – skaffman

+0

मैं जेटी 7 के अंदर जेटी-मेवेन-प्लगइन के माध्यम से इसे चला रहा हूं, लेकिन मुझे नहीं लगता कि इससे कोई फर्क क्यों पड़ता है। मैं एचटीएमएल प्रतिक्रिया देखना चाहता हूं कि ब्राउज़र प्राप्त करने जा रहा है। – csamuel

उत्तर

21

यह बेहतर एक सर्वलेट Filter बजाय एक स्प्रिंग HandlerInterceptor का उपयोग किया जाएगा, कारण यह है कि एक Filter अनुरोध और/या प्रतिक्रिया वस्तुओं स्थानापन्न करने के लिए अनुमति दी है, और आप एक आवरण के साथ प्रतिक्रिया स्थानापन्न करने के लिए इस का उपयोग कर सकते जो प्रतिक्रिया आउटपुट लॉग करता है।

इसमें HttpServletResponseWrapper का सबक्लास लिखना शामिल होगा, getOutputStream (और संभवतः getWriter()) को ओवरराइड करना शामिल होगा। ये विधियां OutputStream/PrintWriter कार्यान्वयन लौटाएंगी जो कि लॉग में प्रतिक्रिया स्ट्रीम को बंद कर देती है, इसके मूल गंतव्य को भेजने के अलावा। ऐसा करने का एक आसान तरीका TeeOutputStreamApache Commons IO से उपयोग कर रहा है, लेकिन स्वयं को लागू करना मुश्किल नहीं है।

यहाँ बात तुम कर सकते हो की तरह का एक उदाहरण है, स्प्रिंग के GenericFilterBean और DelegatingServletResponseStream, साथ ही TeeOutputStream का इस्तेमाल कर रही, चीजों को आसान बनाने के लिए:

public class ResponseLoggingFilter extends GenericFilterBean { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { 
     HttpServletResponse responseWrapper = loggingResponseWrapper((HttpServletResponse) response);  
     filterChain.doFilter(request, responseWrapper); 
    } 

    private HttpServletResponse loggingResponseWrapper(HttpServletResponse response) { 
     return new HttpServletResponseWrapper(response) { 
     @Override 
     public ServletOutputStream getOutputStream() throws IOException { 
      return new DelegatingServletOutputStream(
       new TeeOutputStream(super.getOutputStream(), loggingOutputStream()) 
      ); 
     } 
     }; 
    } 

    private OutputStream loggingOutputStream() { 
     return System.out; 
    } 
} 

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

+0

दरअसल यह अधिक जटिल हो जाता है क्योंकि बंद करने के लिए DelegatingServletOutputStream पर आक्रमण नहीं किया जाता है क्योंकि कंटेनर उस बिंदु पर दायरे से बाहर होता है जब कंटेनर स्ट्रीम बंद कर देता है। इस बारे में कोई विचार है कि आप इसके बारे में कैसे जा सकते हैं? – Ellis

9

यदि आप अपने लॉगिंग फ्रेमवर्क के रूप में logback का उपयोग कर रहे हैं (या विचार कर रहे हैं), तो एक अच्छा सर्वलेट फ़िल्टर पहले से ही उपलब्ध है जो ठीक है। documentation में टीफिल्टर अध्याय चेकआउट करें।

6

मैं थोड़ी देर के लिए पूर्ण HTTP अनुरोध/प्रतिक्रिया लॉग करने का एक तरीका ढूंढ रहा हूं और पता चला है कि इसे Tomcat 7 RequestDumperFilter में मेरे लिए हल किया गया है। यह टॉमकैट 7 कंटेनर से विज्ञापित के रूप में काम करता है। यदि आप जेटी में इसका उपयोग करना चाहते हैं, तो कक्षा ठीक से अकेले काम करती है या जैसा मैंने किया, कॉपी किया और मेरे पर्यावरण की विशिष्ट आवश्यकताओं को अनुकूलित किया।

+0

ऐसा लगता है कि इस फ़िल्टर को भी इस उत्तर में शामिल किया गया है: http://stackoverflow.com/questions/5672904/replacement-for-requestdumpervalve-in-tomcat-7। श्री Twiggs के लिए –

+1

, टॉमकैट 7 RequestDumperFilter केवल हेडर डंप कर सकते हैं, जो बहुत आसान है। – Justin

1

मैंने मैवेन सेंट्रल के माध्यम से एक छोटी लाइब्रेरी spring-mvc-logger उपलब्ध कराई।

जोड़ें pom.xml करने के लिए:

<dependency> 
    <groupId>com.github.isrsal</groupId> 
    <artifactId>spring-mvc-logger</artifactId> 
    <version>0.2</version> 
</dependency> 

web.xml में जोड़ें:

<filter> 
    <filter-name>loggingFilter</filter-name> 
    <filter-class>com.github.isrsal.logging.LoggingFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>loggingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

जोड़ें log4j.xml रहे हैं:

<logger name="com.github.isrsal.logging.LoggingFilter"> 
    <level value="DEBUG"/> 
</logger> 
संबंधित मुद्दे