Java.util.log को log4j पर कैसे भेजें?


84

मेरे पास एक मौजूदा एप्लिकेशन है जो log4j के खिलाफ इसकी सभी लॉगिंग करता है। हम कई अन्य पुस्तकालयों का उपयोग करते हैं जो या तो log4j का उपयोग करते हैं, या कॉमन्स लॉगिंग के खिलाफ लॉग करते हैं, जो हमारे वातावरण में कवर के तहत log4j का उपयोग करके समाप्त होता है। हमारी निर्भरता में से एक भी slf4j के खिलाफ लॉग करता है, जो भी ठीक काम करता है क्योंकि यह अंततः log4j को भी दर्शाता है।

अब, मैं कुछ कैशिंग आवश्यकताओं के लिए इस एप्लिकेशन में ehcache जोड़ना चाहूंगा। Ehcache के पिछले संस्करणों में कॉमन्स-लॉगिंग का उपयोग किया गया था, जिसने इस परिदृश्य में पूरी तरह से काम किया होगा, लेकिन संस्करण 1.6-Beta1 के रूप में उन्होंने कॉमन्स-लॉगिंग पर निर्भरता को हटा दिया है और इसके बजाय java.util.log के साथ बदल दिया है।

वास्तव में java.util.log के साथ उपलब्ध JDK लॉगिंग से परिचित नहीं है, क्या लॉग 4j के खिलाफ JUL लॉग में भेजे गए किसी भी लॉग संदेश को रखने का एक आसान तरीका है, इसलिए मैं अपने मौजूदा कॉन्फ़िगरेशन का उपयोग कर सकता हूं और किसी भी आने वाले लॉगिंग के लिए सेट कर सकता हूं एह्के से?

JUL के लिए javadocs को देखते हुए, ऐसा लगता है कि मैं पर्यावरण चर का एक समूह स्थापित कर सकता हूं जिसे बदलने के लिए LogManagerकार्यान्वयन का उपयोग किया जाता है, और शायद LoggerJUL Loggerवर्ग में log4j को लपेटने के लिए इसका उपयोग करें । क्या यह सही तरीका है?

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

जवाबों:


37

एक दृष्टिकोण जो मैंने सफलतापूर्वक उपयोग किया है वह है slf4j का उपयोग मेरी प्राथमिक लॉगिंग एपीआई के रूप में। मैं तो log4j करने के लिए slf4j बाइंड है। अन्य पार्टी फ्रेमवर्क (जैसे JUL) का उपयोग करते हुए तीसरी पार्टी पर निर्भरता को slf4j पर लागू किया जा सकता है


2
अच्छा लिंक है, लेकिन मुझे लगता है कि आप का मतलब था # जुल-टू-स्लफ 4j
अरकनिद

यह एक अच्छे दृष्टिकोण की तरह लगता है, सिवाय इसके कि मैं इसे काम
मैट बी

2
इसके अलावा, मैं विश्वास नहीं कर सकता कि ehcache के रूप में लोकप्रिय एक पुस्तकालय java.util.log जैसी चीज़ पर स्विच कर देगा - बहुत हड्डीवाला लगता है
मैट बी

1
@matt b, JUL जावा रनटाइम में हमेशा मौजूद रहता है इसलिए इसे कम से कम बाहरी निर्भरता की आवश्यकता होती है। हालाँकि, यह मेरी नज़र में उस कोड के उदाहरणों के साथ अनुभव नहीं किए गए लोगों द्वारा लिखे गए कोड का एक सच्चा उदाहरण है। विन्यास प्रणाली बल्कि असुविधाजनक है।
थोरबजोरन रावन एंडरसन

1
आपके पास समस्या यह है कि यदि आप SLF4J को JUL में पुल करते हैं, तो लॉगिंग प्रदर्शन भयावह है। विशेष रूप से प्रत्येक लॉग लाइन आप एक अपवाद का परिणाम बनाते हैं जो यह निर्धारित करने के लिए कि किस लकड़हारा संदर्भ का उपयोग करना है। यह बहुत सारे ओवरहेड बनाता है और प्रक्रियाओं को धीमा कर देता है
एग्वोर डिक्

19

हम अपने वर्तमान प्रोजेक्ट पर SLF4J का उपयोग करते हैं और यह हमारे लिए बहुत अच्छा काम करता है। SLF4J को Log4J के निर्माता Ceki Gülcü द्वारा लिखा गया है, और उन्होंने वास्तव में बहुत अच्छा काम किया है। हमारे कोड में हम सीधे SLF4J लॉगिंग एपीआई का उपयोग करते हैं, और हम SLF4J को कॉन्फ़िगर करते हैं ताकि जकार्ता कॉमन्स लॉगिंग (JCL), java.util.log (JUL) से कॉल करें , और Log4J API सभी SLF4J API से ब्रिज किए जाते हैं। हमें ऐसा करने की आवश्यकता है क्योंकि आप की तरह हम तीसरे पक्ष (खुले स्रोत) के पुस्तकालयों का उपयोग करते हैं जिन्होंने विभिन्न लॉगिंग एपीआई को चुना है।

SLF4J के निचले भाग पर, आप किसी विशेष लकड़हारा कार्यान्वयन का उपयोग करने के लिए इसे कॉन्फ़िगर करते हैं। यह एक आंतरिक, या "सरल" लकड़हारा के साथ आता है, और आप इसे Log4J, JUL, या Logback के साथ ओवरराइड कर सकते हैं । विन्यास सभी अपने वर्गपथ में विभिन्न जार फ़ाइलों में छोड़ने के द्वारा किया जाता है।

मूल रूप से, हमने लॉगबैक कार्यान्वयन का उपयोग किया, जिसे कैकी गुल्क द्वारा लिखा गया था। यह बहुत शक्तिशाली है। हालाँकि, हमने तब अपने एप्लिकेशन को ग्लासफिश जावा ईई एप्लिकेशन सर्वर पर तैनात करने का निर्णय लिया, जिसके लॉग दर्शक JUL- स्वरूपित संदेशों की अपेक्षा करते हैं। इसलिए आज मैंने Logback से JUL में स्विच किया, और कुछ ही मिनटों में मैंने दो Logback jars को SLF4J जार से बदल दिया जो इसे JUL कार्यान्वयन से जोड़ता है।

इसलिए @overthink की तरह, मैं आपके सेटअप में SLF4J का उपयोग करने की सलाह दूंगा।


8
Ceki को लॉगिंग फ्रेमवर्क / फासीदे को कितनी बार बदलने की आवश्यकता है?
एम.पी.

@ एमपी: लॉगिंग ग्लैमरस नहीं हो सकता है, लेकिन यह बड़े पैमाने पर वाणिज्यिक-ग्रेड सॉफ्टवेयर के लिए एक महत्वपूर्ण आवश्यकता है। और SLF4J कोड को एकीकृत करने की समस्या को हल करता है जो असमान लॉगिंग चौखटे का उपयोग करता है (लॉग 4 जे को अपनाने के बजाय java.utils.log को विकसित करने के लिए सूर्य के चुनाव से अधिक तत्काल बनाया गया है)।
जिम फेर्र्स

3
@ mP, slf4j जरूरी था क्योंकि खराब काम रवि ने JUL के साथ किया था। Logback log4j का एक कांटा है, एक नई परियोजना नहीं है।
थोरबजोरन रेव एंडरसन

3
मुझे लॉगबैक आवश्यक लगा, यदि कुछ और नहीं तो यह अपाचे नहीं है, और यह वास्तव में प्रलेखित है।
स्पेंसर कोरम्स

13

लॉग 4j के साथ JUL को पाटने के लिए SLF4J की तुलना में एक सरल विकल्प है, http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html देखें

आपको बस क्लास-ब्रिज पर jul-log4j- ब्रिज डालना है और सिस्टम प्रॉपर्टी जोड़ना है:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager

जुल-लॉग 4 जे-ब्रिज मावेन सेंट्रल में नहीं है और इस भंडार से प्राप्त किया जा सकता है:

<repository>
  <id>psmith</id>
  <url>http://people.apache.org/~psmith/logging.apache.org/repo</url>
  <releases>
    <enabled>false</enabled>
  </releases>
</repository>

और फिर इसके साथ प्रयोग किया जाता है:

<dependency>
  <groupId>org.apache.logging</groupId>
  <artifactId>apache-jul-log4j-bridge</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>log4j</groupId>
      <artifactId>apache-log4j-component</artifactId>
    </exclusion>
  </exclusions>
</dependency>

निम्नलिखित चरणों के साथ स्रोतों से इसका पुनर्निर्माण करना भी संभव है:

  1. svn co http://svn.apache.org/repos/asf/log/sandbox/jul-to-log4s-bridge/
  2. pom.xml संपादित करें, log4j पर निर्भरता बदलें: log4j: 1.2.15 log4j के साथ: apache-log4j-extras: 1.2.17 और apache-log4j- घटक पर निर्भरता को हटा दें
  3. mvan पैकेज

4
मुझे लगता है कि यह सरल है क्योंकि यह आपके कोड को बदलने के बिना किया जा सकता है, आपको बस एक सिस्टम प्रॉपर्टी जोड़ना होगा। SLF4J अभी तक एक समान तंत्र का प्रस्ताव नहीं करता है, आप या तो कोड या logging.propertiesफ़ाइल को बदलते हैं ।
इमैनुएल बॉर्ग

1
यह log4j2 में मौजूद नहीं है, दुर्भाग्य से :(
BeepDog

JulLog4jBridge.assimilate();o_0
बैस्टियन

2
चेतावनी! jul-log4j-bridgeकभी जारी नहीं किए गए apache-log4j-companionsबंडल (परित्यक्त से एक बैकपोर्ट log4j 1.3) का उपयोग करता है । आपके पास इसे बनाने में कठिन समय होगा। स्वाभाविक रूप से, पुल को भी पूर्व-रिलीज़ छोड़ दिया गया है, भी।
ivan_pozdeev

@ivan_pozdeev अच्छी बात है, धन्यवाद। मैंने इसे बनाने के लिए निर्देश जोड़े हैं।
Emmanuel Bourg

9

अक्टूबर 2014

चूंकि log4j का संस्करण 2.1 घटक log4j-jul में मौजूद है, जो वास्तव में इसकी अनुमति देता है। फिर भी, यदि आप log4j 1 का उपयोग कर रहे हैं, तो इस दृष्टिकोण का उपयोग करने के लिए log4j2 में अपग्रेड करना संभव है।

JDK लॉगिंग एडाप्टर

कक्षा LogManager

Log4j 1.x से log4j 2 पर माइग्रेट करें


2
अब तक (2018 के मध्य में) यह स्वीकृत उत्तर होना चाहिए
rmuller

भविष्य के पाठकों के लिए: मैं पुष्टि करता हूं कि यह काम कर रहा है। तो, मूल रूप से (1) इसे अपने pom mvnrepository.com/artifact/org.apache.log.log4j/log4j-jul और (2) में जोड़कर सिस्टम प्रॉपर्टी को पहले लिंक में जोड़ें (जैसे, JVV पैरामीटर एड-डेज में। use.log.manager = org.apache.log.log4j.jul.LogManager)
एल-दीन

3

मुझे लगता है कि slf4j साइट का मानना ​​है कि slf4j (और इसलिए log4j) के माध्यम से java.util.log घटनाओं को पारित करने के लिए एक पुल है।

हां, SLF4J डाउनलोड में jul-to-slf4j शामिल है जो मुझे लगता है कि बस यही करता है। इसमें SLF4J को रिकॉर्ड पास करने के लिए JUL हैंडलर है।


2

@ वाईशाई - मेरी विकि पर लिंक पोस्ट करने के लिए धन्यवाद। उदाहरण ने JUL को Log4J पर पुनर्निर्देशित किया है और मैंने इसे कुछ वर्षों के लिए उत्पादन प्रणाली में चलाया है। JBoss 5.x पहले से ही JUL को Log4J पर पुनर्निर्देशित करता है, इसलिए मैंने इसे अपग्रेड करते समय बाहर निकाल दिया। मेरे पास एक नया है जो SLF4J पर पुनर्निर्देशित करता है, जिसका उपयोग मैं अब कुछ चीजों पर करता हूं। जब मौका मिलेगा, तब पोस्ट करूंगा।

हालाँकि, SLF4J पहले से ही है:

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j


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