प्रवेश के लिए नियम और सलाह?


13

मेरे संगठन में, हमने लॉग इन करने के बारे में कुछ नियम / गिल्ड एक साथ रखे हैं जिन्हें मैं जानना चाहूंगा कि क्या आप जोड़ सकते हैं या टिप्पणी कर सकते हैं।

हम जावा का उपयोग करते हैं, लेकिन आप सामान्य रूप से लॉगगिन के बारे में टिप्पणी कर सकते हैं - नियम और सलाह

  1. सही लॉगिंग स्तर का उपयोग करें

    • त्रुटि: कुछ बहुत गलत हो गया है और तुरंत ठीक करने की आवश्यकता है
    • चेतावनी: प्रक्रिया को ठीक किए बिना जारी रह सकता है। आवेदन को इस स्तर को सहन करना चाहिए लेकिन चेतावनी की हमेशा जांच होनी चाहिए।
    • जानकारी: एक महत्वपूर्ण प्रक्रिया समाप्त होने की सूचना
    • डीबग। केवल विकास के दौरान उपयोग किया जाता है
  2. सुनिश्चित करें कि आप जानते हैं कि आप क्या लॉग कर रहे हैं।

  3. इससे बचें कि लॉगिंग एप्लिकेशन के व्यवहार को प्रभावित करता है

लॉगिंग का कार्य लॉग में संदेश लिखने के लिए होना चाहिए।

  1. लॉग संदेश वर्णनात्मक, स्पष्ट, संक्षिप्त और संक्षिप्त होना चाहिए।

समस्या निवारण के दौरान एक बकवास संदेश का अधिक उपयोग नहीं होता है।

  1. Log4j में सही गुण लगाएं

उस में रखो सही विधि और वर्ग स्वचालित रूप से लिखा जाता है।

उदाहरण:

Datedfile -web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. लॉग मान।

कृपया एप्लिकेशन से मान लॉग करें।

  1. उपसर्ग लॉग करें।

राज्य जो आवेदन का हिस्सा है कि लॉगिंग से लिखा है, अधिमानतः परियोजना के लिए कुछ के साथ सहमत उपसर्ग जैसे PANDORA_DB

  1. पाठ की राशि।

सावधान रहें ताकि बहुत अधिक लॉगिंग पाठ न हो। यह ऐप के प्रदर्शन को प्रभावित कर सकता है।

  1. लॉगगिंग प्रारूप:

-हालांकि कई वेरिएंट और तरीके log4j के साथ उपयोग करने के लिए हैं, लेकिन हम निम्न प्रारूप का एक समान उपयोग करना चाहते हैं, जब हम अपवादों पर लॉग इन करते हैं:

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

ऊपर दिए गए उदाहरण में यह माना जाता है कि हमने log4j गुण निर्धारित किए हैं ताकि यह स्वचालित रूप से वर्ग और विधि लिख सके।

हमेशा लकड़हारे का उपयोग करें और निम्नलिखित नहीं:

System.out.println(), System.err.println(), e.printStackTrace()

यदि वेब ऐप हमारे ढांचे का उपयोग करता है, तो आप ईजेबी से बहुत विस्तृत त्रुटि जानकारी प्राप्त कर सकते हैं, यदि हैंडलर में ट्राइ-कैच का उपयोग करें और ऊपर दिए गए मॉडल के अनुसार लॉगिंग करें:

हमारी परियोजना में हम इस रूपांतरण पैटर्न का उपयोग करते हैं, जिसके साथ विधि और वर्ग नाम स्वचालित रूप से लिखे जाते हैं। यहाँ हम कंसोल के लिए और datedfileappender के लिए दो अलग-अलग पेटेंट का उपयोग करते हैं:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

उपरोक्त दोनों उदाहरणों में विधि और वर्ग wioll को बाहर लिखा जाना चाहिए। कंसोल में पंक्ति संख्या भी हमारी लिखी जाएगी।

  1. toString()

कृपया toString()प्रत्येक वस्तु के लिए है। पूर्व:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

विशेष विधि के बजाय जो इन आउटपुट को बनाते हैं

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

तो क्या आप लॉगिंग का उपयोग करने के इन तरीकों से कुछ भी जोड़ सकते हैं, टिप्पणी कर सकते हैं या प्रश्नवाचक हो सकते हैं? यहां तक ​​कि यदि यह जावा, जावा से संबंधित नहीं है, तो भी जवाब देने या टिप्पणी करने के लिए स्वतंत्र महसूस करें, यह तर्क है कि यह कैसे तर्कपूर्ण है।



1
@gnat - मुझे लगता है कि आप सही हैं, दो प्रश्नों के बीच बहुत अधिक ओवरलैप है। हालांकि मैं इसे डुप्लिकेट कहने के लिए संघर्ष कर रहा हूं।

जवाबों:


4

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

मुझे डिबग के नीचे एक परत देखने की आदत है जिसे मैं "ट्रेस" कहता हूं, लेकिन यह जरूरी नहीं कि एक सार्वभौमिक शब्द हो। "ट्रेस" स्तर लॉगिंग ट्रैक जितना संभव हो उतना संभव हो सकता है, जिसमें मॉड्यूल एंट्री / एग्जिट, एंट्री / एग्जिट के साथ टाइमस्टैम्प, और पास किए गए मानों को कैप्चर करने के लिए बोनस पॉइंट्स शामिल हैं। जाहिर है, यह डेटा का एक बहुत कुछ उत्पन्न करता है और यह कुछ ऐसा नहीं है जिसे आप विली-निली चालू करते हैं। लेकिन इसमें डिबगिंग के संबंध में फायदे हैं जब आप प्रक्रिया में संलग्न नहीं हो सकते हैं या आपके पास गलत एप्लिकेशन का एक कोर डंप नहीं है।

मुझे अपनी लॉग जानकारी के साथ फ़ाइल / मॉड्यूल संदर्भ और टाइमस्टैम्प देखना पसंद है। यह आसान हो सकता है जब थ्रेड्स के बीच दौड़ की स्थितियों का शिकार करने की कोशिश के साथ-साथ एप्लिकेशन के कई क्षेत्रों की गतिविधियों का समन्वय किया जाए। निष्पक्ष होने के लिए, मुझे कुछ लोगों का पता है जो सोचते हैं कि ये विवरण लॉग फ़ाइल को अव्यवस्थित करते हैं। टीम के साथ चर्चा करने के लिए टाइमस्टैम्प में जोड़ना कुछ है। (माफी अगर log4j पहले से ही ऐसा है।)

यदि लॉगिंग का ध्यान नहीं रखा जा रहा है तो इसका स्वयं का धागा / प्रक्रिया है, इस पर भी कुछ विचार करना है। लॉगिंग प्रक्रिया के लिए एप्लिकेशन थ्रेड बनाने के बजाय, लॉग संदेश लॉग हैंडलर को पास हो जाता है और एप्लिकेशन थ्रेड अपने मैरे रास्ते पर चला जाता है। वैकल्पिक रूप से, लॉग संदेशों को संभालने के लिए किसी प्रकार के बफर तंत्र का निर्माण करना अनुप्रयोग प्रतिक्रिया को गति देने का एक और तरीका है।

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


2

ध्यान रखने वाली एक बात यह है कि लॉगिंग के लिए किसी भी प्रकार के स्ट्रिंग ऑपरेशन करने से पहले लॉगिंग स्तर की जांच करें। यदि आप लॉग फॉर्मेट बनाने के लिए डेट फॉर्मेटर सेट करने या स्ट्रिंग्स का एक समूह बनाने के सभी काम पर नहीं जाते हैं, यदि आप वास्तव में इसे लॉग करने नहीं जा रहे हैं। यह सिर्फ व्यर्थ का काम है जो आपके आवेदन को धीमा कर देता है।

FYI करें, Apache Commons प्रोजेक्ट में एक ToStringBuilder वर्ग है जो आपके toString()तरीकों को बनाने में सरल बनाता है।


1

आपने निक में जो कुछ भी जोड़ा है, उसमें मुझे कुछ भी संदिग्ध नहीं लगता है। ऐसा मैं कुछ समय से कर रहा हूं। आपके द्वारा प्रदान किया गया पोस्ट बहुत विस्तृत है और संभवतः लॉगिंग के लिए एक तरह के ट्यूटोरियल के रूप में उपयोग किया जा सकता है। हालाँकि, मैं एक बात यहाँ जोड़ना चाहता हूँ, जो है: कई स्थानों पर, मैं सशर्त लॉगिंग का उपयोग करते हुए देख रहा हूँ, जैसे:

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

मुझे लगता है कि इस तरह की सशर्त अनुरेखण या डिबगिंग का सबसे अच्छा तरीका नहीं है।


1

कक्षा / विधि को लॉग करने के अलावा जिसने त्रुटि को उठाया, यह उस विधि में दिए गए मापदंडों को लॉग करने के लिए भी उपयोगी होगा। यह जानते हुए कि एक त्रुटि को उठाया गया था, अगर यह केवल 1000 में से 1 बार होता है तो बहुत उपयोगी नहीं है; आपको यह भी जानना होगा कि किस डेटा के कारण त्रुटि हुई।

मैंने एक चर के लिए भी उपयोगी पाया है जो किसी अनुप्रयोग के लिए लॉगिंग के डिफ़ॉल्ट स्तर को परिभाषित करता है। इस तरह आपके पास चेतावनी और त्रुटि कोड के साथ DEBUG और INFO कोड हो सकते हैं। उत्पादन मोड में चलने पर आप इसे डिबग जानकारी को आउटपुट नहीं करने के लिए डिफ़ॉल्ट करते हैं, लेकिन जब एक बग दिखाता है तो आप एक ध्वज को अपडेट कर सकते हैं और लॉग में भी डीबग संदेश लिखना शुरू कर सकते हैं।


1

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

उस और अन्य मुद्दों को रोकने के लिए जब लॉगिंग और "वास्तविक" व्यापार लॉगिक्स को आप पहलू उन्मुख प्रोग्रामिंग का उपयोग कर संबंध बनाना चाहिए। जावा के लिए सबसे अधिक उपयोग किया जाने वाला ढांचा AspectJ होगा। Google टेक वार्ता का यह youtube वीडियो है जो AspectJ और इसके उपयोग को बहुत अच्छी तरह से लॉगिंग से परे बताता है। स्टैकएक्सचेंज पर भी यहां खुद को लॉग इन करने के लिए आपको कई उदाहरण मिलेंगे ।


0

एक बात मैं सुझाता हूं कि आपके पास किसी विशेष लॉग फ़ाइल के साथ जुड़े कई लॉगिंग संदर्भ होने का एक साधन है, और व्यवस्था करें ताकि किसी भी लॉगिंग संदर्भ के लिए लिखा गया कुछ भी लॉग हो जाए, जब तक कोड स्पष्ट रूप से लॉगिंग संदर्भ को अपनी सामग्री को छोड़ने के लिए नहीं कहता है। ऐसा डिज़ाइन किसी ऑपरेशन के दौरान विस्तृत लॉग को कैप्चर करने की अनुमति देगा और यदि ऑपरेशन सफल हो जाता है तो उन्हें छोड़ देगा, लेकिन यदि ऑपरेशन विफल हो जाता है तो उन्हें उपलब्ध है। ऐसी लॉगिंग सुविधा से अनुपस्थित, जब कुछ विफल होने पर अच्छे लॉग उपलब्ध हों, तो आवश्यकता हो सकती है कि 99.99% समय में जब सब कुछ काम करता है, तो बेकार डेटा लॉग करने में बहुत समय बर्बाद होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.