2012-04-14 15 views
42

के बाहर अक्का लॉगिंग मेरे पास एक अक्का अभिनेता है जो MyObject.foo() को कॉल करता है। MyObject एक अभिनेता नहीं है। मैं इसमें लॉगिंग कैसे सेट करूं? एक अभिनेता के साथ यह आसान है, क्योंकि मैं सिर्फ ActorLogging मिश्रण कर सकते हैं। MyObject में, मुझे context.system तक पहुंच नहीं है। क्या मैं AkkaSevent() के साथ akka.event.Logging बना रहा हूं और फिर लॉगसोर्स के लिए क्या अंतर्निहित है?अभिनेता

+0

क्या आपने इसे पढ़ लिया है? : http://doc.akka.io/docs/akka/2.0/scala/logging.html –

+6

@ विक्टर क्लेंग हाँ। ऐसा लगता है कि यह मेरे प्रश्न को संबोधित नहीं करता है, हालांकि, न ही यह वर्णन करता है कि अक्का घटना लॉगर की आवश्यकता क्यों है (जैसा कि केवल अभिनेता के भीतर एसएलएफ 4 जे का उपयोग करने के विपरीत है)। – Bradford

+1

क्योंकि आप किसी अभिनेता के माध्यम से लॉगिंग करने के बाद से किसी भी लॉगिंग बैकएंड एसिंक्रोनस कर सकते हैं। –

उत्तर

22

असल में मैं अक्का लॉगिंग को पर रीडायरेक्ट करता हूं और इस एपीआई का उपयोग सीधे सभी असंबंधित वर्गों में करता हूं। सबसे पहले आपके विन्यास से जोड़ें:

akka { 
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"] 
    loglevel = "DEBUG" 
} 

फिर कुछ SLF4J कार्यान्वयन चुनते हैं, तो मैं सुझाव देते हैं। आपके कलाकारों में ActorLogging विशेषता का उपयोग जारी रखें। अन्य वर्गों में बस एसएलएफ 4 जे एपीआई पर भरोसा करते हैं - या इससे भी बेहतर - एसएलएफ 4 जे के आसपास slf4s मुखौटा का प्रयास करें।

युक्ति: Logback में निम्न लॉगिंग पैटर्न आजमा कर देखें:

<pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %X{akkaSource} | %logger{1} | %m%n%rEx</pattern> 

%X{akkaSource} अभिनेता पथ प्रिंट होगा जब उपलब्ध (सिर्फ मानक लॉगिंग की तरह)।

+0

धन्यवाद।मुझे पूरी तरह से यकीन नहीं है कि क्यों अभिनेता लॉजिंग मौजूद है, लेकिन जब से यह करता है, क्या इससे कोई फर्क नहीं पड़ता कि मेरे अभिनेता जिस तरीके से कॉल कर रहा है वह एसकेएफ 4 जे एपीआई का उपयोग सीधे अक्का के लॉगिंग इवेंट सिस्टम का उपयोग करने के बजाय करेगा? कोई खतरा? वैकल्पिक रूप से, मैं एक लॉगिंग अभिनेता बना सकता हूं और वहां लॉग संदेश भेज सकता हूं। यहां क्या पसंद किया जाता है? – Bradford

+1

लेकिन यदि आप सीधे SLF4J के कारखाने का उपयोग करते हैं, तो आपको Async लॉगिंग नहीं मिलती है, है ना? मैं सिस्टम ऑब्जेक्ट एटीएम तक पहुंचने के लिए गंदे स्टेटिक्स का उपयोग कर रहा हूं:/ –

+2

@ एंटनी स्टब्स: नहीं, अगर आप एसिंक्रोनस लॉगिंग से लाभ प्राप्त करना चाहते हैं, तो आपको कुछ अभिनेता को एक संदेश भेजना होगा - और उस अभिनेता का संदेश लॉग इन करने के लिए उपयोग करना होगा .. –

8

अब मैं डी कन्स्ट्रक्टर इंजेक्शन (गुइस) के माध्यम से बस अपने केंद्रीय लॉगिंग सिस्टम को पार करने के लिए बस गया हूं। और मेरे वर्गों है कि नियमित रूप से प्रवेश करने है में (जहां asynchronicity महत्वपूर्ण है), मैं इंजेक्शन ActorSystem लेने के लिए और

this.log = akka.event.Logging.getLogger(actorSystem, this); 
वर्गों निर्माता में

कहते हैं।

+3

एक और विकल्प, जिसे आप उन मामलों के लिए बेहतर पसंद कर सकते हैं जहां आप इस तरह के संदर्भ को रखने के लिए ऑब्जेक्ट को विकसित नहीं करना चाहते हैं, लॉगिंग करने की आवश्यकता वाले तरीकों के लिए दूसरी पैरामीटर सूची '(निहित लॉग: लॉगिंग एडाप्टर)' जोड़ना है। – AmigoNico

20

अक्का 2.2.1 का उपयोग करना, मैं एक अभिनेता के बाहर प्रवेश करने पाने के लिए मेरे अनुप्रयोग में डाल करने में सक्षम था:

import akka.event.Logging 
val system = ActorSystem("HelloSystem", ConfigFactory.load.getConfig("akka")) 
val log = Logging.getLogger(system, this) 
log.info("Hi!") 

यह एक आवेदन की लॉगिंग को एकीकृत करने के लिए एक सरल समाधान की तरह लगता है।

+0

यह मुझे जाने का सबसे आसान तरीका था - धन्यवाद! – akauppi

+6

यह उत्तर वास्तविक समस्या को हल नहीं करता है। आप कक्षा में कुछ लॉगिंग करने के लिए बस एक संपूर्ण अभिनेता सिस्टम बनाते हैं। यदि आपको कहीं और चाहिए तो क्या आप एक और अभिनेता सिस्टम बनाने जा रहे हैं? साथ ही साथ अपने पहले बनाए गए अभिनेता सिस्टम के संदर्भ को भी पास कर सकते हैं। –

6

जैसा कि उल्लेख किया गया है, आप एक अभिनेता प्रणाली के भीतर गैर-अभिनेता लॉगिंग के विकल्पों के लिए खराब हो गए हैं। मैं आपको यह निर्धारित करने में मदद करने के लिए हेरिस्टिक का एक सेट प्रदान करने का प्रयास करने जा रहा हूं कि आपको अपने काम के लिए लॉगिंग कैसे करना चाहिए।

  1. तुम एक लकड़हारा (log4j 1.x, logback, log4j 2.x) दोनों अभिनेता और गैर अभिनेता कोड में सीधे उपयोग कर सकते हैं।
    • यह आपके कोड को लॉगर कार्यान्वयन के साथ जोड़ता है। यह ठीक है अगर यह आपका कोड है, कहीं और इस्तेमाल नहीं किया जाना चाहिए, लेकिन यदि आप लाइब्रेरी बना रहे हैं या अपना काम स्रोत खोलने का इरादा रखते हैं तो ठीक नहीं है।
    • यदि आप ऐसा करते हैं, तो आपको अभिनेता प्रणाली से कोई लाभ नहीं मिलता है। लॉगिंग कॉल कॉलिंग अवरुद्ध हो सकती है, इस पर निर्भर करता है कि आपके लॉगर को कैसे सेट अप किया गया है, और इस प्रकार यह कहीं भी डूब गया है कि बैक प्रेशर पर प्रदर्शन या नियंत्रण महत्वपूर्ण चिंताएं हैं।
    • क्योंकि अभिनेता कोड (सेवाओं के साथ यह उपभोग कर सकता है) कई अलग-अलग धागे पर काम कर सकता है, कुछ पारंपरिक लॉगिंग गतिविधियां जैसे कि थ्रेडलोकल एमडीसी (मैप्ड डायग्नोस्टिक कंटेक्स्ट) के उपयोग के कारण विचित्र दौड़ की स्थिति और लॉग आउटपुट के साथ संदर्भ स्विटिचिंग हो सकती है अभिनेता से अभिनेता तक जाने वाले संदेशों से। उन्हें भेजने से पहले संदेशों पर एमडीसी को स्वैप करने जैसी गतिविधियां अभिनेता और गैर अभिनेता कोड के बीच संदर्भ को संरक्षित करने के लिए आवश्यक हो सकती हैं।
    • ऐसे मृत पत्र और पर्यवेक्षण के रूप में ActorSystem घटनाओं पर कब्जा करने के लिए, आप एक प्रवेश एडाप्टर लिख सकते हैं और अपने application.conf में यह निर्दिष्ट करने की आवश्यकता हो सकती है। ये बहुत सरल हैं।
  2. आप अभिनेता और गैर-अभिनेता लॉगिंग दोनों के लिए एसएलएफ 4 जे मुखौटा का उपयोग कर सकते हैं।
    • अब आप लॉगर इम्प्लायर के साथ नहीं हैं और आपकी सेवाएं अक्का के साथ नहीं हैं। पोर्टेबिलिटी के लिए यह सबसे अच्छा विकल्प है।
    • आप अपने लॉग ढांचे से अवरुद्ध व्यवहार का उत्तराधिकारी हो सकते हैं।
    • आप MDCs
    • प्रबंधन करने के लिए ActorSystem घटनाओं आप अपने application.conf में "akka.event.slf4j.Slf4jLogger" का उल्लेख करना होगा कैप्चर करने के लिए हो सकता है
    • आप पर एक slf4j प्रदाता जार दर्ज करनी होगी अपनी चुनी लकड़हारा के लिए रास्ते में slf4j लॉग घटनाओं के लिए classpath
  3. आप दोनों अभिनेता और गैर अभिनेता कोड में अपने मुखौटे के रूप में अक्का की लॉगिंग का उपयोग कर सकते
    • तुम एक लकड़हारा impl के लिए युग्मित नहीं कर रहे हैं या एस के लिए lf4j, लेकिन आप अक्का के एक संस्करण के साथ मिलकर हैं। यह शायद आपके सिस्टम की एक आवश्यकता है, लेकिन पुस्तकालयों के लिए यह पोर्टेबिलिटी को कम कर सकता है।
    • आपको लॉगर्स के लिए "बस" के रूप में कार्य करने के लिए एक अभिनेता प्रणाली को पास करना होगा। एक कार्यकारी अभिनेता प्रणाली के साथ चुस्त युग्मन पोर्टेबिलिटी को और कम कर देता है। (एक ऐप के भीतर मैं आम तौर पर एक अंतर्निहित या वैश्विक अभिनेता सिस्टम के साथ एक छोटी लॉगिंगवियाएक्टर सिस्टम तंत्र का निर्माण करता हूं, जो कोड में इस से निपटने में आसान बनाता है लेकिन निर्भरताओं में नहीं)।
    • गैर-अवरुद्ध एसिंक्रोनस लॉगिंग की गारंटी है, भले ही आपका लॉगर उनका समर्थन न करे। लॉगिंग की कारण स्थिरता एक उपभोक्ता मेलबॉक्स के उपयोग के कारण होने की संभावना है। हालांकि, मेमोरी सुरक्षा और बैक प्रेशर नहीं हैं (मेरा मानना ​​है कि अक्का लॉगिंग एक असंबद्ध मेलबॉक्स का उपयोग करता है) -
    • आपके खुद के एमडीसी के प्रबंधन की जटिलता से बचने के लिए DiagnosticLoggingAdapter के उपयोग जैसे विकल्प हैं क्योंकि कार्य अभिनेता से अभिनेता तक गुजरता है। इन एमडीसी को गैर-अभिनेता कोड उत्परिवर्तित करने के बावजूद संगठनात्मकता संरक्षित की जानी चाहिए।
    • लॉगिंग एक आउट-ऑफ-स्मृति दुर्घटना के दौरान उपलब्ध होने की संभावना नहीं है, और डिफ़ॉल्ट डिस्पैचर
    • आप जब तक आप रुचि रखते हैं application.conf में अपने चुने हुए लकड़हारा का उल्लेख करना होगा पर भुखमरी थ्रेड के प्रति संवेदनशील है प्रवेश में मानक बाहर

को आप मिश्रण और के रूप में आपकी आवश्यकताओं को पूरा करने के लिए आवश्यक ऊपर व्यवहार से मेल करने के लिए स्वागत है। उदाहरण के लिए, आप पुस्तकालयों के लिए एसएलएफ 4 जे से जुड़ना चुन सकते हैं और बाकी सब कुछ के लिए अक्का लॉगिंग का उपयोग कर सकते हैं। बस ध्यान दें कि ब्लॉकिंग और गैर-अवरुद्ध लॉगिंग मिश्रण से दौड़ की स्थिति हो सकती है जहां कारण (एक अभिनेता के माध्यम से लॉग इन एसिंक) लॉग इन होते हैं (उनके सिंक को सीधे लॉग इन करते हैं)।

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