2012-08-08 8 views
5

मैं वितरित सिस्टम में लॉगिंग घटक जोड़ने की कोशिश कर रहा हूं। वर्तमान स्रोत-कोड को चेन करने से बचने के लिए यह AspectJ में लिखा गया है। मैं लॉग भेजने के लिए सॉकेट एपेंडर का उपयोग करता हूं, लेकिन मैं कुछ और अधिक प्रभावी कोशिश करना चाहता हूं।वितरित प्रणाली में कौन से परिशिष्ट का उपयोग किया जाना चाहिए? उन्हें कैसे कॉन्फ़िगर करें?

मैंने सुना है कि मुझे JMSAppender और AsyncAppender का उपयोग करना चाहिए, लेकिन मैं इसे कॉन्फ़िगर करने में विफल रहा। क्या मुझे Receiver बनाना चाहिए जो लॉग एकत्र करता है और उन्हें डेटाबेस और जीयूआई में पास करता है (मैं ChainSaw का उपयोग करता हूं)?

मैंने turorial1 और tutorial2 का पालन करने का प्रयास किया, लेकिन वे पर्याप्त स्पष्ट नहीं हैं।

enter image description here

संपादित करें:

एक छोटा सा डेमो में मैं मैं एक अनुरोध के लिए 6 लॉग भेजा (3 घटकों के सिमुलेशन)

[2012-08-08 15:40:28,957] [request1344433228957] [Component_A] [start] 
[2012-08-08 15:40:32,050] [request1344433228957] [Component_B] [start] 
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [start] 
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [end - throwing] 
[2012-08-08 15:40:32,144] [request1344433228957] [Component_B] [end] 
[2012-08-08 15:40:32,175] [request1344433228957] [Component_A] [end] 

सॉकेट appender का उपयोग करते हुए तैयार किया है। तो मेरी log4j.properties है:

log4j.rootLogger=DEBUG, server 

log4j.appender.server=org.apache.log4j.net.SocketAppender 
log4j.appender.server.Port=4712 
log4j.appender.server.RemoteHost=localhost 
log4j.appender.server.ReconnectionDelay=1000 

तो मैं

>java -classpath log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties 

चलाने विन्यास के साथ

log4j.rootLogger=DEBUG, CA, FA 

# 
log4j.appender.CA=org.apache.log4j.ConsoleAppender 
log4j.appender.CA.layout=org.apache.log4j.PatternLayout 
log4j.appender.CA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n 

# 
log4j.appender.FA=org.apache.log4j.FileAppender 
log4j.appender.FA.File=report.log 
log4j.appender.FA.layout=org.apache.log4j.PatternLayout 
log4j.appender.FA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n 

तब मैं Chainsaw करने के लिए फ़ाइल अपने लॉग भेजें:

enter image description here

यह बिल्कुल बुनियादी है, लेकिन मैं सीखना चाहता हूं कि इसे बेहतर कैसे किया जाए। सबसे पहले, मैं लॉग को असीमित रूप से भेजना चाहता हूं। फिर बहुत सरल रिसीवर बनाएं, जो उदा। एक फ़ाइल में लॉग पास कर सकते हैं।

मैंने ऊपर सूचीबद्ध ट्यूटोरियल का पालन करने की कोशिश की, लेकिन मैं असफल रहा। तो सवाल यह है: क्या आप कुछ उदाहरण कॉन्फ़िगरेशन प्रदान कर सकते हैं? Receiver.java और log4.properties फाइलों का उदाहरण?

उत्तर

2

अंततः मुझे यह पता चला है कि इसे कैसे कॉन्फ़िगर किया जाए। मैंने 2 फाइलें src फ़ोल्डर में रखीं।

jndi.properties

topic.logTopic=logTopic 

और log4j-jms.properties

log4j.rootLogger=INFO, stdout, jms 

## Be sure that ActiveMQ messages are not logged to 'jms' appender 
log4j.logger.org.apache.activemq=INFO, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= 

## Configure 'jms' appender. You'll also need jndi.properties file in order to make it work 
log4j.appender.jms=org.apache.log4j.net.JMSAppender 
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory 
log4j.appender.jms.ProviderURL=tcp://localhost:61616 
log4j.appender.jms.TopicBindingName=logTopic 
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory 

तब मैं वी एम तर्क

-Dlog4j.configuration=log4j-jms.properties 

के साथ अपने कार्यक्रम चलाने के लिए और कक्षा में लॉग प्राप्त Receiver.java

public class Receiver implements MessageListener { 

    PrintWriter pw = new PrintWriter("result.log"); 
    Connection conn; 
    Session sess; 
    MessageConsumer consumer; 

    public Receiver() throws Exception { 


     ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
     Connection conn = factory.createConnection(); 
     Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     conn.start(); 
     MessageConsumer consumer = sess.createConsumer(sess.createTopic("logTopic")); 
     consumer.setMessageListener(this); 
    } 

    public static void main(String[] args) throws Exception { 
     new Receiver(); 

    } 

    public void onMessage(Message message) { 
     try { 
      LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message).getObject(); 

      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); 
      String nowAsString = df.format(new Date(event.getTimeStamp())); 

      pw.println("["+ nowAsString + "]" + 
        " [" + event.getThreadName()+"]" + 
        " ["+ event.getLoggerName() + "]" + 
        " ["+ event.getMessage()+"]"); 
      pw.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
2

मैं एनएफएस या सीडीएफएस का उपयोग करता हूं और सभी मशीनों पर एक ड्राइव माउंट करता हूं। प्रत्येक एप्लिकेशन इंस्टेंस को एक अलग फ़ाइल में लिखें। आप एक ही निर्देशिका में सभी लॉग ढूंढ पाएंगे (या ड्राइव) इससे कोई फर्क नहीं पड़ता कि आप कितनी मशीनों का उपयोग करते हैं।

मैं उच्च विलंबता के साथ वैश्विक वैन पर एनएफएस या सीडीएफएस का उपयोग नहीं करूंगा उदा। > 50 एमएस दौर यात्रा। इस कारण मैंने जेएमएस का उपयोग किया है (लेकिन मैंने log4j का उपयोग नहीं किया है)

+0

मुझे मशीन के नाम से अनुरोध प्रकार के अनुसार लॉग को अलग-अलग फ़ाइलों में विभाजित करने की आवश्यकता है। क्या यह संभव है? – alicjasalamon

+0

क्या आपको इसे वास्तविक समय में करने की ज़रूरत है या इसे रात में संसाधित किया जा सकता है? प्रति फ़ाइल एक फ़ाइल बहुत अक्षम हो सकती है। यदि आप कुछ समय संवेदनशील महसूस कर रहे हैं तो मैं log4j का किसी भी तरह से उपयोग नहीं करता। ;) –

+0

मेरा विचार था: संदेश को 'रिसीवर' में जेएमएस एपेंडर द्वारा असीमित रूप से भेजा जाता है। 'रिसीवर '50 के समूह में सबसे लंबे अनुरोध या एक अनुरोध का चयन करता है, फिर उन्हें चेनसो और डेटा बेस पर भेज दें। क्या मैं इस स्थिति में log4j का उपयोग नहीं करना चाहिए? मैं एक ** आसान ** समाधान – alicjasalamon

2

मेरे दो सेंट .. आप जो कुछ भी करते हैं, सुनिश्चित करें कि आप रिसीवर को अपने लॉग देने के लिए एसिंक्रोनस तंत्र का उपयोग करते हैं, अन्यथा यह अंततः आपके स्टाल को समाप्त कर देगा क्षुधा। लॉग इन करने के लिए एक और बिंदु विश्वसनीय रूप से आपको एपेंडर में निर्मित तंत्र पर असफल होना चाहिए - अगर आप लॉग की देखभाल करते हैं तो रिसीवर कम या लंबे समय तक ऑफलाइन हो सकते हैं, असफलता निश्चित रूप से आवश्यक है। हमने similar system बनाया है जो आप वर्णन करते हैं (जोड़ के लिए खेद है), लेकिन यदि आप चाहें तो आप हमारे एपेंडर का उपयोग कर सकते हैं (downloads देखें), यह मुफ़्त है और इसमें स्रोत हैं। एक वीडियो ट्यूटोरियल भी है। यह असफल रहा है और लचीला एसिंक्रोनस तंत्र और बैकअप वापस आ गया है।

आप कितने परिशिष्ट का उपयोग करना चाहिए? एक जेपीएम प्रति एपेंडर ठीक से करेगा।कॉन्फ़िगरेशन फ़ाइलों को प्रति jvm होना चाहिए, यह सुनिश्चित न करें कि आप रिसीवर को कैसे कार्यान्वित करना चाहते हैं, किसी भी मामले में परिशिष्ट को आपके रिसीवर को खोजने की आवश्यकता होती है जो आमतौर पर होस्ट पोर्ट जोड़ी है। डेटाबेस के बारे में, मेरा अनुभव आरडीबीएमएस के साथ बहुत खट्टा है (हम nosql पर जा रहे हैं) लेकिन यदि आप कुछ सौ मिलियन रिकॉर्ड से ऊपर नहीं जाते हैं, तो अधिकांश वाणिज्यिक डेटाबेस कुछ प्रयास करेंगे। मुझे एक साधारण काम नहीं कहना चाहिए, हमने कुछ गुणवत्ता वाले सिस्टम बनाने के लिए हमें कुछ वर्षों का समय दिया है, जिसे आपने अभी कुछ पतला आयताकारों के साथ खींचा है :)

+0

यह निश्चित नहीं है, निश्चित रूप से :) निश्चित रूप से दूसरे वर्ष के छात्र के लिए नहीं। लॉगफैस बहुत अच्छा लग रहा है और मैं इससे प्रभावित हूं, कोई संदेह नहीं। आपकी सलाह बहुत "उच्च स्तरीय" है, इसलिए मैं अधिक जानकारी प्रदान करने के लिए एक मिनट में अपना प्रश्न संपादित करूंगा। मैं उन सभी तकनीकों के लिए नया हूं जो मैं उपयोग करता हूं, निश्चित रूप से समर्थन की आवश्यकता है। – alicjasalamon

2

मैं syslog और अंतर्निहित syslog एपेंडर की सिफारिश करता हूं। विश्वसनीय लॉगिंग (+ Asyc एपेंडर शायद) या अग्नि-और-भूल लॉगिंग के लिए यूडीपी के लिए टीसीपी का उपयोग करें। यदि आपको आवश्यकता हो तो मेरे पास rsyslog कॉन्फ़िगरेशन है।

+0

syslog एपेंडर का उपयोग करने का नकारात्मक यह है कि आप log4j के साथ आने वाली संरचित जानकारी का एक बहुत खो देते हैं। यदि शुरुआती बिंदु log4j नहीं था निश्चित रूप से एक अच्छा विकल्प होगा। –

+0

सहमत हैं, 3.5 साल बाद, हम अब syslog का उपयोग नहीं करते हैं। (लॉगबैक + लॉगेंट्री एपेंडर)। – Jan

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