जावा लॉग फ़िल्टर के साथ HTTP अनुरोधों को पार्स करें
javax.servlet.फ़िल्टरHTTP अनुरोधों और आउटपुट लॉग की सामग्री को लागू करने और पार्स करने का एक सुविधाजनक तरीका।फ़िल्टरकक्षा का परिचय.
यह लॉग फ़िल्टर लॉग आउटपुट के लिए "java.util.logging.Logger" का उपयोग करता है, और आप लॉग स्तर को बदलकर सूचना आउटपुट को बदल सकते हैं।
javax.servlet.फ़िल्टर क्या है?
वेब एप्लिकेशन बनाते समय, मुख्य व्यवसाय प्रसंस्करण के अलावा, मुख्य व्यवसाय प्रसंस्करण से पहले और बाद में सामान्य माध्यमिक प्रसंस्करण करना आवश्यक है।
उदाहरण के लिए, क्लाइंट प्रमाणीकरण, प्राधिकरण जाँच, लॉगिंग, आदि।
प्रत्येक संसाधन में ऐसी साइड प्रोसेसिंग को कोड करना सॉफ़्टवेयर रखरखाव में बाधा का एक प्रमुख कारण बन जाता है, जिसके परिणामस्वरूप एक ऐसा एप्लिकेशन बनता है जिसे बनाए रखना मुश्किल होता है।
Javax.servlet.Filter को लागू करके, आप आमतौर पर सर्वलेट क्लास में अनुरोध पारित होने से पहले इस साइड प्रोसेसिंग को निष्पादित कर सकते हैं।
साथ ही, चूंकि फ़िल्टर सेटिंग web.xml में की जा सकती है, आप स्रोत कोड को बदले बिना लचीले ढंग से फ़िल्टर जोड़ या हटा सकते हैं।
लॉग फ़िल्टर का उपयोग करने का प्रयास करें
आइए वास्तव में HTTP अनुरोधों को फ़िल्टर करने और उनका विश्लेषण करने के लिए एक लॉग फ़िल्टर का उपयोग करें।
इस समयबिल्लाहम उदाहरण एप्लिकेशन का उपयोग करेंगे जो शुरुआत से उपलब्ध है।
आप निम्न सेटिंग करके इस फ़िल्टर को तुरंत चला सकते हैं.
2. संकलित क्लास फ़ाइल को "/examples/WEB-INF/classes" के अंतर्गत रखें।
3.web.xml में निम्नलिखित परिभाषा सेट करें।
लॉगफ़िल्टर लॉगफ़िल्टर लॉगिंग.स्तर अच्छा लॉगफ़िल्टर /*
*स्ट्रट्स फ्रेमवर्क का उपयोग करते समय यूआरएल-पैटर्न इस प्रकार है।
*।करना
कृपया सत्र उदाहरण स्क्रीन को निष्पादित करने के लॉग आउटपुट परिणामों की जांच करें।
आउटपुट लॉग जानकारी और लॉग स्तर
●आउटपुट सामग्री लॉग करें
लॉग जानकारी | छांटने का स्तर |
---|---|
कुकी जानकारी | अच्छा |
HTTP हेडर जानकारी | अच्छा |
HTTPअन्य जानकारी | अच्छा |
HTTP अनुरोध पैरामीटर | कॉन्फ़िग |
स्कोप ऑब्जेक्ट का अनुरोध करें | कॉन्फ़िग |
सत्र-दायरे वाली वस्तु | कॉन्फ़िग |
अनुरोध से पहले और बाद में मेमोरी का उपयोग | कॉन्फ़िग |
स्क्रीन संक्रमण जानकारी | जानकारी |
निम्न प्रकार से लॉग स्तरों का उपयोग करना सबसे अच्छा है।
- FINE: सबसे विस्तृत लॉग आउटपुट करता है। यदि आप HTTP अनुरोध का विस्तार से विश्लेषण करना चाहते हैं तो इसे सेट करें।
- कॉन्फिग... कुछ हद तक विस्तृत लॉग आउटपुट करता है। विकास अवधि के दौरान इसे इस स्तर पर रखना एक अच्छा विचार है।
- जानकारी: केवल स्क्रीन ट्रांज़िशन जानकारी आउटपुट करता है।
●लॉग लेवल कैसे बदलें
आप इनिशियलाइज़ेशन पैरामीटर लॉगिंग.लेवल सेट करके लॉग आउटपुट स्तर बदल सकते हैं।
उदाहरण:
लॉगिंग.स्तर जानकारी
सोर्स कोड
आयात javax.servlet.फ़िल्टर;
आयात javax.servlet.FilterChain;
आयात javax.servlet.FilterConfig;
आयात javax.servlet.ServletException;
आयात javax.servlet.ServletRequest;
आयात javax.servlet.ServletResponse;
आयात javax.servlet.http.Cookie;
आयात javax.servlet.http.HttpServletRequest;
आयात javax.servlet.http.HttpServletResponse;
आयात javax.servlet.http.HttpSession;
/**
* HTTP अनुरोधों और आउटपुट लॉग की सामग्री का विश्लेषण करने के लिए javax.servlet.Filter लागू करें
*फ़िल्टर क्लास.
*/
सार्वजनिक वर्ग लॉगफ़िल्टर फ़िल्टर लागू करता है {
निजी स्थैतिक लकड़हारा लकड़हारा =
Logger.getLogger(LogFilter.class.getName());
निजी स्थैतिक अंतिम स्ट्रिंग LINE_SEPA =
System.getProperty ("लाइन.सेपरेटर");
निजी स्थैतिक अंतिम स्ट्रिंग NEXT_PAGE = "LogFilter.NEXT_PAGE";
/**
* इस लॉग फ़िल्टर को प्रारंभ करें।
* @परम मैपिंग
*/
सार्वजनिक शून्य init (फ़िल्टर कॉन्फ़िग मैपिंग) {
स्ट्रिंग str = मैपिंग.getInitParameter(“लॉगिंग.लेवल”);
System.out.println ("लॉग स्तर को "+str+" पर सेट करें।");
लेवल स्तर = शून्य;
कोशिश {
लेवल = लेवल.पार्स(str);
} पकड़ें (अपवाद ई) {
ई.प्रिंटस्टैकट्रेस();
लेवल = लेवल.जानकारी;
}
LogManager.getLogManager().reset();
हैंडलर हैंडलर = नया CustomConsoleHandler();
हैंडलर.सेटफॉर्मेटर(नया कस्टमफॉर्मेटर());
हैंडलर.सेटलेवल(स्तर);
लकड़हारा.सेटलेवल(स्तर);
logger.getParent().addHandler(हैंडलर);
}
/**
* यह एक फिल्टर है जो लॉग को आउटपुट करता है।
* @param अनुरोध HTTP अनुरोध संसाधित किया जा रहा है
* @परम प्रतिक्रिया HTTP प्रतिक्रिया उत्पन्न हो रही है
* @परम श्रृंखला
*/
सार्वजनिक शून्य doFilter(ServletRequest _request, ServletResponse _response,
फ़िल्टरचेन श्रृंखला) IOException, ServletException फेंकता है {
//----------------------"प्रीप्रोसेसिंग"
HttpServletRequest अनुरोध = (HttpServletRequest) _request;
HttpServletResponse प्रतिक्रिया = (HttpServletResponse) _response;
यदि (logger.isLoggable(Level.CONFIG)) {
लकड़हारा.config(
"============ अनुरोध शुरू करें!!"
+"थ्रेड आईडी:"
+ थ्रेड.करंटथ्रेड().हैशकोड()
+ ” ========================================================”);
}
// स्मृति प्रयोग
स्ट्रिंग एक्शनमेमोरी = शून्य;
यदि (logger.isLoggable(Level.CONFIG)) {
एक्शनमेमोरी = getMemoryInfo(''
+ नया समय(System.currentTimeMillis()) + ”अनुरोध[पिछला]”);
}
यदि (logger.isLoggable(Level.FINE)) {
logger.fine(“कुकी जानकारी” + getCookieInfo(अनुरोध));
}
यदि (logger.isLoggable(Level.FINE)) {
logger.fine(“HTTP हेडर जानकारी” + getHeadersInfo(अनुरोध));
}
यदि (logger.isLoggable(Level.FINE)) {
लकड़हारा
.fine(“HTTP अन्य जानकारी” + getRequestOtherInfo(अनुरोध));
}
यदि (logger.isLoggable(Level.CONFIG)) {
स्ट्रिंग रेकलॉग = getRequestParametersInfo(अनुरोध);
logger.config ("HTTP अनुरोध पैरामीटर" + reqlog);
}
यदि (logger.isLoggable(Level.CONFIG)) {
logger.config('अनुरोध स्कोप ऑब्जेक्ट'
+ getRequestAttributeInfo(अनुरोध));
}
यदि (logger.isLoggable(Level.CONFIG)) {
स्ट्रिंग सेशनलॉग = getSessionInfo (अनुरोध, सत्य);
logger.config ("सत्र स्कोप ऑब्जेक्ट (अनुरोध प्रसंस्करण से पहले)"
+ सेशनलॉग);
}
// अगले फ़िल्टर को कॉल करें
चेन.डूफ़िल्टर(अनुरोध, प्रतिक्रिया);
// -------------------- "प्रोसेसिंग के बाद"
यदि (logger.isLoggable(Level.CONFIG)) {
स्ट्रिंग सेशनलॉग = getSessionInfo(अनुरोध, गलत);
logger.config ("सत्र स्कोप ऑब्जेक्ट (अनुरोध प्रसंस्करण के बाद)"
+ सेशनलॉग);
}
// स्मृति प्रयोग
यदि (logger.isLoggable(Level.CONFIG)) {
एक्शनमेमोरी = "अनुरोध से पहले और बाद में मेमोरी का उपयोग"+LINE_SEPA
+ एक्शनमेमोरी + LINE_SEPA
+ getMemoryInfo(” ” + नया समय(System.currentTimeMillis())
+ "अनुरोध[बाद]");
logger.config(actionMemory+LINE_SEPA);
}
// स्क्रीन ट्रांज़िशन जानकारी
यदि (logger.isLoggable(Level.INFO)) {
स्ट्रिंग नेक्स्टपेज = (स्ट्रिंग) request.getAttribute(NEXT_PAGE);
यदि (अगला पृष्ठ == शून्य || अगला पृष्ठ.लंबाई() == 0) {
अगला पृष्ठ = request.getRequestURI();
}
logger.info(“NEXT_PAGE=[” + NextPage + “],”
+ "IP_ADDRESS=[" + request.getRemoteAddr() + "], "
+ “SESSION_ID=[” + request.getSession().getId() + “],”
+ "USER-Agent=[" + request.getHeader("user-agent") + "]");
}
यदि (logger.isLoggable(Level.CONFIG)) {
लकड़हारा.config(
"============ अनुरोध समाप्त!!"
+"थ्रेड आईडी:"+ थ्रेड.करंटथ्रेड().हैशकोड()
+ ” =========================================================”
+LINE_SEPA+LINE_SEPA);
}
}
/**
*
*/
सार्वजनिक शून्य नष्ट() {
}
// ---------- नीचे निजी विधि -----------
निजी स्थैतिक स्ट्रिंग getMemoryInfo(स्ट्रिंग संदेश) {
DecimalFormat dFromat = नया DecimalFormat(“#,###KB”);
लंबा मुफ़्त = Runtime.getRuntime().freeMemory() / 1024;
लंबा कुल = Runtime.getRuntime().totalMemory() / 1024;
long max = Runtime.getRuntime().maxMemory() / 1024;
लंबे समय तक उपयोग = कुल - मुफ़्त;
स्ट्रिंग संदेश = संदेश + " : " + "कुल=" + dFromat.format(कुल) + ", "
+ “प्रयुक्त राशि=” + dFromat.format(प्रयुक्त) + ” (” + (प्रयुक्त * 100 / कुल)
+ "%), अधिकतम उपलब्ध=" + dFromat.format(अधिकतम);
वापसी संदेश;
}
/**
* सभी अनुरोध हेडर को लॉग में आउटपुट करें।
*/
निजी स्थैतिक स्ट्रिंग getHeadersInfo(HttpServletRequest अनुरोध) {
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र(LINE_SEPA);
गणना हेडरनाम = request.getHeaderNames();
जबकि (headerNames.hasMoreElements()) {
स्ट्रिंग हेडरनाम = (स्ट्रिंग) हेडरनाम.नेक्स्टएलिमेंट();
buff.append('');
buff.append(headerName);
buff.append(“=”);
buff.append(request.getHeader(headerName));
buff.append(LINE_SEPA);
}
वापसी buff.toString();
}
निजी स्थैतिक स्ट्रिंग getCookieInfo(HttpServletRequest अनुरोध) {
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र();
कुकी[] कुकीज़ = request.getCookies();
यदि (कुकीज़ == शून्य) {
वापस करना "";
}
के लिए (int i = 0; i < कुकीज़.लंबाई; i++) {
buff.append(“\n — कुकी[” + i + “] —\n”);
buff.append('');
buff.append(कुकीज़[i].getName());
buff.append(“=”);
buff.append(कुकीज़[i].getValue());
buff.append(LINE_SEPA);
buff.append('');
buff.append('getVersion()');
buff.append(“=”);
buff.append(कुकीज़[i].getVersion());
buff.append(LINE_SEPA);
buff.append('');
buff.append('getComment()');
buff.append(“=”);
buff.append(कुकीज़[i].getComment());
buff.append(LINE_SEPA);
buff.append('');
buff.append('getDomain()');
buff.append(“=”);
buff.append(कुकीज़[i].getDomain());
buff.append(LINE_SEPA);
buff.append('');
buff.append('getMaxAge()');
buff.append(“=”);
buff.append(कुकीज़[i].getMaxAge());
buff.append(LINE_SEPA);
buff.append('');
buff.append('getPath()');
buff.append(“=”);
buff.append(कुकीज़[i].getPath());
buff.append(LINE_SEPA);
buff.append('');
buff.append('getSecure()');
buff.append(“=”);
buff.append(कुकीज़[i].getSecure());
buff.append(LINE_SEPA);
}
वापसी buff.toString();
}
निजी स्थैतिक स्ट्रिंग getRequestParametersInfo(HttpServletRequest अनुरोध) {
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र(LINE_SEPA);
मानचित्र नक्शा = ConvertRequest(अनुरोध);
ट्रीमैप टीआरआर = नया ट्रीमैप(मानचित्र);
इटरेटर आईटीआर = trr.keySet().iterator();
जबकि (itr.hasNext()) {
स्ट्रिंग कुंजी = (स्ट्रिंग) itr.next();
buff.append('');
बफ़.एपेंड(कुंजी);
buff.append(“=”);
वस्तु मान = मानचित्र.प्राप्त(कुंजी);
स्ट्रिंग[] मान = (स्ट्रिंग[]) मान;
यदि (मूल्य.लंबाई == 1) {
buff.append(मान[0]);
} अन्य {
// स्ट्रिंग सरणी परिवर्तित हो गई है
स्ट्रिंग स्ट्रवैल्यू = स्ट्रैटम(मान);
buff.append(strValue);
}
buff.append(LINE_SEPA);
}
वापसी buff.toString();
}
निजी स्थैतिक स्ट्रिंग getRequestAttributeInfo(HttpServletRequest अनुरोध) {
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र(LINE_SEPA);
गणना ई = request.getAttributeNames();
जबकि (e.hasMoreElements()) {
स्ट्रिंग नाम = (स्ट्रिंग) e.nextElement();
buff.append('नाम='+नाम+', विशेषतावर्ग='
+ request.getAttribute(name).getClass().getName()
+ ", toString() = " + request.getAttribute(नाम)
+ LINE_SEPA);
}
वापसी buff.toString();
}
निजी स्थैतिक स्ट्रिंग getRequestOtherInfo(HttpServletRequest अनुरोध) {
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र();
buff.append(LINE_SEPA);
buff.append('getCharacterEncoding()=');
buff.append(request.getCharacterEncoding());
buff.append(LINE_SEPA);
buff.append('getContentLength()=');
buff.append(request.getContentLength());
buff.append(LINE_SEPA);
buff.append('getContentType()=');
buff.append(request.getContentType());
buff.append(LINE_SEPA);
buff.append('getLocale()=');
buff.append(request.getLocale());
buff.append(LINE_SEPA);
buff.append('getProtocol()=');
buff.append(request.getProtocol());
buff.append(LINE_SEPA);
buff.append('getRemoteAddr()=');
buff.append(request.getRemoteAddr());
buff.append(LINE_SEPA);
buff.append('getRemoteHost()=');
buff.append(request.getRemoteHost());
buff.append(LINE_SEPA);
buff.append('getScheme()=');
buff.append(request.getScheme());
buff.append(LINE_SEPA);
buff.append('getServerName()=');
buff.append(request.getServerName());
buff.append(LINE_SEPA);
buff.append('getServerPort()=');
buff.append(request.getServerPort());
buff.append(LINE_SEPA);
buff.append('isSecure()=');
buff.append(request.isSecure());
buff.append(LINE_SEPA);
buff.append('getAuthType()=');
buff.append(request.getAuthType());
buff.append(LINE_SEPA);
buff.append('getContextPath()=');
buff.append(request.getContextPath());
buff.append(LINE_SEPA);
buff.append('getMethod()=');
buff.append(request.getMethod());
buff.append(LINE_SEPA);
buff.append('getPathInfo()=');
buff.append(request.getPathInfo());
buff.append(LINE_SEPA);
buff.append('getPathTranslated()=');
buff.append(request.getPathTranslated());
buff.append(LINE_SEPA);
buff.append('getQueryString()=');
buff.append(request.getQueryString());
buff.append(LINE_SEPA);
buff.append('getRemoteUser()=');
buff.append(request.getRemoteUser());
buff.append(LINE_SEPA);
buff.append('getRequestedSessionId()=');
buff.append(request.getRequestedSessionId());
buff.append(LINE_SEPA);
buff.append('getRequestURI()=');
buff.append(request.getRequestURI());
buff.append(LINE_SEPA);
buff.append('getServletPath()=');
buff.append(request.getServletPath());
buff.append(LINE_SEPA);
buff.append('getUserPrincipal()=');
buff.append(request.getUserPrincipal());
buff.append(LINE_SEPA);
buff.append('isRequestedSessionIdFromCookie()=');
buff.append(request.isRequestedSessionIdFromCookie());
buff.append(LINE_SEPA);
buff.append('isRequestedSessionIdFromURL()=');
buff.append(request.isRequestedSessionIdFromURL());
buff.append(LINE_SEPA);
buff.append('isRequestedSessionIdValid()=');
buff.append(request.isRequestedSessionIdValid());
buff.append(LINE_SEPA);
वापसी buff.toString();
}
निजी स्थैतिक स्ट्रिंग getSessionInfo(HttpServletRequest अनुरोध, बूलियन पहले) {
HttpSession सत्र = request.getSession();
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र();
buff.append(LINE_SEPA);
यदि (पहले) {
buff.append(' session.isNew() = ' + session.isNew());
buff.append(LINE_SEPA);
buff.append(' session.getId() = ' + session.getId());
buff.append(LINE_SEPA);
}
गणना ई = session.getAttributeNames();
जबकि (e.hasMoreElements()) {
स्ट्रिंग सत्रनाम = (स्ट्रिंग) e.nextElement();
स्ट्रिंग सेशनक्लासनाम = session.getAttribute(sessionName)
.getClass().getName();
buff.append('नाम='+सेशननाम+',मूल्य='
+ session.getAttribute(sessionName) + ", एट्रिब्यूटक्लास = "
+ सेशनक्लासनाम+LINE_SEPA);
}
वापसी buff.toString();
}
निजी स्थैतिक हैशटेबल कन्वर्ट रिक्वेस्ट (HttpServletRequest अनुरोध) {
हैशटेबल tempHash = नया हैशटेबल();
गणना ई = request.getParameterNames();
जबकि (e.hasMoreElements()) {
स्ट्रिंग कुंजी = (स्ट्रिंग) e.nextElement();
स्ट्रिंग[] मान = request.getParameterValues(कुंजी);
स्ट्रिंग[] पैरामीटरवैल्यूज़ = नया स्ट्रिंग[वैल्यू.लेंथ];
के लिए (int i = 0; i < values.length; i++) {
पैरामीटरवैल्यू[i] = convUnicode(मान[i]);
}
tempHash.put(कुंजी, पैरामीटरवैल्यू);
}
वापसी tempHash;
}
निजी स्थैतिक स्ट्रिंग स्ट्रेटम (ऑब्जेक्ट मान) {
यदि (मान == शून्य) {
वापसी "शून्य";
} अन्यथा यदि (स्ट्रिंग का मान उदाहरण[]) {
वापसी convString((स्ट्रिंग[]) मान);
} अन्य {
वापसी मान.toString();
}
}
/**
* स्ट्रिंग सरणी [strArray] की सामग्री को नीचे की तरह एक स्ट्रिंग के रूप में लौटाता है।
* "[temp1,temp2,temp3]"
* @param strArray स्ट्रिंग सरणी का मूल्यांकन किया जाना है
* @रूपांतरण के बाद रिटर्न स्ट्रिंग
*/
निजी स्थैतिक स्ट्रिंग convString(स्ट्रिंग[] strArray) {
यदि (strArray == शून्य)
शून्य वापसी;
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र ("[");
के लिए (int i = 0; i < strArray.length; i++) {
buff.append(strArray[i] + “,”);
}
buff.delete(buff.length() – 2, buff.length());
buff.append(“]”);
वापसी buff.toString();
}
/**
* [str] को यूनिकोड में बदलें।
* @परम स्ट्र
* @वापस करना
*/
निजी स्थैतिक स्ट्रिंग convUnicode(स्ट्रिंग str) {
अगर (str == शून्य)
शून्य वापसी;
कोशिश {
नई स्ट्रिंग लौटाएँ(str.getBytes('8859_1'), 'JISAutoDect');
} पकड़ें (UnsupportedEncodingException e) {
नया रनटाइम अपवाद (ई) फेंकें;
}
}
// ———————————————————————–
स्थैतिक वर्ग कस्टमफ़ॉर्मेटर फ़ॉर्मेटर का विस्तार करता है {
स्थिर अंतिम स्ट्रिंग पैटर्न = "yyyy/MM/dd HH:mm:ss";
सार्वजनिक सिंक्रनाइज़ स्ट्रिंग प्रारूप (लॉगरिकॉर्ड रिकॉर्ड) {
स्ट्रिंगबफ़र बफ़ = नया स्ट्रिंगबफ़र();
// दिनांक और समय सेट करें
तारीख तारीख = नई तारीख();
दिनांक.सेटटाइम(रिकॉर्ड.गेटमिलिस());
SimpleDateFormat फ़ॉर्मेटर = नया SimpleDateFormat(पैटर्न);
buf.append(formatter.format(date));
buf.append(“:”);
// स्तर निर्धारित करें
buf.append(“[” + रिकार्ड.getLevel().getName() + “]”);
buf.append(“:”);
buf.append(record.getMessage());
buf.append(LINE_SEPA);
वापसी buf.toString();
}
}
स्थिर वर्ग CustomConsoleHandler स्ट्रीमहैंडलर का विस्तार करता है {
सार्वजनिक CustomConsoleHandler() {
बहुत अच्छा();
setOutputStream(System.out);
}
/**
* एक लॉगरिकॉर्ड जारी करता है।
* प्रारंभ में, लॉगिंग अनुरोध लॉगर ऑब्जेक्ट पर भेजे जाते हैं।
* और यह ऑब्जेक्ट LogRecord को प्रारंभ करता है
*यहां पुनर्निर्देशित।
*
* @परम रिकॉर्ड लॉग इवेंट का विवरण। शून्य रिकॉर्ड्स को आसानी से नजरअंदाज कर दिया जाता है
* और कोई अधिसूचना नहीं भेजी जाएगी.
*/
सार्वजनिक शून्य प्रकाशन(लॉगरिकॉर्ड रिकॉर्ड) {
सुपर.प्रकाशित(रिकॉर्ड);
फ्लश();
}
/**
* स्ट्रीमहैंडलर को ओवरराइड करें। फ्लश करने के लिए बंद करें, लेकिन
* आउटपुट स्ट्रीम बंद नहीं है. दूसरे शब्दों में, System.err बंद नहीं है.
*/
सार्वजनिक शून्य बंद() {
फ्लश();
}
}
}