Tomcat6 और Servlet के साथ लॉग इन करते समय लॉक नहीं मिल सका

मैं एक logfile में RequestHeaders लॉग करना चाहता हूँ। मैंने निम्नलिखित किया:

public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static Logger logger = Logger.getLogger("myLogger");

    public TestServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        FileHandler fileHandler = new FileHandler("logfile.txt", true);
        logger.addHandler(fileHandler);

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String title = "Request Headers";
        out.println("<html>" +
                    "<body BGCOLOR=\"#FDF5E6\">\n" +
                    "

" + title + "

\n" + "Request Method: " + request.getMethod() + "
\n" + "Request URI: " + request.getRequestURI() + "
\n" + "Request Protocol: " + request.getProtocol() + "

\n" + "<table BORDER=1 ALIGN=CENTER>\n" + "<tr BGCOLOR=\"#DGAD00\">\n" + "<th>Header Name<th>Header Value"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); out.println("<tr><td>" + headerName); out.println(" <td>" + request.getHeader(headerName)); } out.println("</table>\n</body></html>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

मुझे निम्नलिखित अपवाद मिलता है: java.io.IOException: logfile.txt के लिए लॉक नहीं मिल सका

मैं Tomcat6.0.32 और java.util.logging का उपयोग कर रहा हूँ।

0

1 उत्तर

लॉगर जोड़ने का यह दृष्टिकोण गलत है।

आवेदन को तैनात करने के बाद पहली बार शर्त लगाई गई, यह काम करता है; दूसरी बार से विफल रहता है। क्यूं कर? क्योंकि हर बार logger.addHandler (fileHandler) को कॉल किया जाता है, एक और हैंडलर जोड़ा जाता है। तो दूसरी बार 2 हैंडलर लॉगफाइल को लिखने की कोशिश करेंगे; तीसरी बार तीन; और इसी तरह। सौभाग्य से हैंडलर फ़ाइल को लॉक करने का प्रयास करता है, इसलिए पहला सफल होता है जबकि इसके बाद अपवाद के साथ विफल रहता है। यदि लॉक अपवाद फेंक दिया गया था, तो आप इस तरह के संदेश बैठेंगे:

1st time
2nd time
2nd time
3rd time
3rd time
3rd time

...और इसी तरह।

यह भी मौका है कि आपके पास logfile.txt पर लिखने की अनुमति नहीं है।

वैसे भी, उचित कॉन्फ़िगरेशन फ़ाइल में एक बार हैंडलर जोड़ने का समाधान है।

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

private static Logger logger = Logger.getLogger("myLogger");
private static Logger headersLogger = Logger.getLogger("headersLogger");
1
जोड़ा
अगर मैं पूर्ण पथ जोड़ता हूं, तो यह काम करता है! और आप गलत हैं: यह तैनाती के बाद सही काम नहीं करता है, लेकिन आपकी व्याख्या अच्छी लगती है।
जोड़ा लेखक Chris311, स्रोत
मैं उपरोक्त आपके सुझाव का पालन करने की कोशिश करूंगा। अब क्या होता है निम्नलिखित है: हर बार जब मैं एक जीईटी अनुरोध भेजता हूं, तो एक नया लॉक बनता है (जैसा कि आपने बताया है)। मैं एक ही लॉगफाइल में हर जीईटी अनुरोध लिखना चाहता हूं।
जोड़ा लेखक Chris311, स्रोत
क्षमा करें, मेरा मतलब है कि प्रत्येक अनुरोध एक ही फ़ाइल में है।
जोड़ा लेखक Chris311, स्रोत
ठीक है, मैंने FileHanlder के निर्माता को प्रारंभकर्ता में स्थानांतरित कर दिया। अब सब कुछ ठीक काम करता है।
जोड़ा लेखक Chris311, स्रोत
यह अजीब बात है कि यह काम करता है ... किसी भी मामले में यह एक हैंडलर जोड़ने का सही तरीका नहीं है। यदि यह डिबगिंग के लिए एक अस्थायी पैच है, तो कम से कम servlet की init() विधि में करें।
जोड़ा लेखक Nikos Paraskevopoulos, स्रोत
आप का मतलब है कि प्रत्येक अनुरोध को एक फ़ाइल में और अलग पिछले की तुलना में? यदि ऐसा है तो मैं सुझाव दूंगा कि आपने FileHandler का कस्टम सबक्लास बनाया है जो इस व्यवहार को लागू करता है (और इसे कॉन्फ़िगरेशन में ठीक से जोड़ें :-)
जोड़ा लेखक Nikos Paraskevopoulos, स्रोत