ग्रहण: log4j.xml में log4j.dtd को संदर्भित करना


117

मैं काफी समय से log4j का उपयोग कर रहा हूं और मैं आमतौर पर log4j.xml के शीर्ष पर इसका उपयोग करता हूं (शायद कई अन्य लोगों की तरह और Google के अनुसार यह ऐसा करने का तरीका है):

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

जाहिर है कि यह काम कर रहा है, हालांकि एक्सेल एक्सएमएल और सभी लिखने के लिए अपनी संदर्भ-संवेदनशील मदद नहीं करता है। इसके अलावा, यह हमेशा एक चेतावनी दिखाता है कि यह नहीं मिलती है log4j.dtd। अब मैं उत्सुक हूं कि इसे कैसे ठीक किया जाए।

मैंने कुछ चीजें और ये काम करने की कोशिश की:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:/path/.m2/repository/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd">
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

जैसा कि आप ऊपर से देख सकते हैं कि हम मावेन का उपयोग कर रहे हैं। इसलिए, मैंने यह कोशिश की, लेकिन यह विफल है:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:${M2_REPO}/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd">

एक्लिप्स आमतौर पर क्लासपैथ चर से निपटने का तरीका जानता है, लेकिन यह काम क्यों नहीं करता है? मुझे पता है कि संदर्भ रनटाइम के दौरान काम नहीं करेगा, लेकिन न तो एक सरल log4j.dtd(यदि मैं गलत नहीं हूं), तो यह समस्या नहीं होनी चाहिए।

क्या कोई इस पर प्रकाश डाल सकता है?

जवाबों:


176

मुझे पता है कि इस सवाल का जवाब दिया गया है, लेकिन मैं अपना थोड़ा अलग विकल्प प्रदान करना चाहता हूं:

<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

यह @ FrVaBe की प्रतिक्रिया के समान है , लेकिन साथ ही साथ, आगे किसी भी ग्रहण कॉन्फ़िगरेशन की आवश्यकता नहीं है (यानी, यदि आप अपनी परियोजना को दूसरों के साथ साझा कर रहे हैं, या एक बड़ी टीम है, तो यह चिंता करने वाली एक कम बात है)।

हालांकि, यह है कि मैं मानता हूं कि इसका मतलब है कि आपको इंटरनेट कनेक्शन की आवश्यकता होगी (कम से कम विकास के दौरान कुछ बिंदु पर, भले ही यह सिर्फ एक समय हो)।


यह दृष्टिकोण स्वीकृत उत्तर से बेहतर है, क्योंकि आपको डीडीटी फ़ाइल के भौतिक स्थान से निपटना नहीं है। यह आपकी परियोजना को अन्य डेवलपर्स के साथ साझा करते समय मदद करता है।
इक्के।

1
दिलचस्प। अब मुझे log4j 2.0 के लिए dtd को ढूंढना है - क्या दर्द - मेरी संपत्ति फ़ाइल कॉन्फ़िगरेशन वापस!
मार्टिन

8
कुछ समय पहले इसने काम करना बंद कर दिया था। यदि आप एक ब्राउज़र में लॉग इन करने के लिए जाते हैं। logache.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/… तो आप देखेंगे कि अब एक xml त्रुटि है
किप

@ आप सही हैं, लिंक काम नहीं कर रहा है। यहाँ किसी के साथ कोई अद्यतन लिंक मिला?
मैनडेयर

मैंने कर्ल के साथ लिंक की जाँच की और इसने एक पूर्ण DTD लौटा दिया। अगर मैंने इसे एक ब्राउज़र में देखने की कोशिश की, तो यह त्रुटियों को लौटाता है। मैं इसे कर्ल जैसे टूल के साथ जांचने का सुझाव दूंगा।
जॉन साल्य

41

"विशिष्ट -> XML -> XML कैटलॉग" में उपयोगकर्ता विशिष्ट URI XML कैटलॉग प्रविष्टि के रूप में log4j.dtd को जोड़ने का प्रयास करें। जैसा कि मुझे पता है कि यह वह जगह है जहाँ ग्रहण परिभाषा / सत्यापन फ़ाइलों (जैसे xsd) के संदर्भों का प्रबंधन करता है। यदि उन्हें यहां पाया जा सकता है तो ग्रहण को उनके मूल (वेब) स्थान पर पहुंचने के लिए इंटरनेट की आवश्यकता नहीं है।

मैंने इसे इस तरह किया (परीक्षण के लिए) और ग्रहण की शिकायत नहीं है:

Entry element:    URI
Location:         C:\Users\me\Desktop\log4j.dtd
URI:              file:///C:/Users/me/Desktop/log4j.dtd
Key type:         URI
Key:              http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd

शायद $ {M2_REPO} काम भी करता है - मैंने इसकी जाँच नहीं की।

बाद में अपने log4j.xml में मूल URL का उपयोग करें

<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

संपादित करें

मैं उपरोक्त समाधान के साथ जाऊंगा लेकिन आपके प्रश्न पर वापस आने के लिए, मुझे लगता है कि क्लास पथ चर 'जावा बिल्ड पथ में उपयोग किया जा सकता है' उन्हें DOCTYPE परिभाषा के अंदर क्यों काम करना चाहिए? "Validate" (ग्रहण संदर्भ मेनू) log4j.xml फ़ाइल और आपको एक चेतावनी मिलेगी कि पथ हल नहीं किया जा सकता है।

मुझे आशा classpath:org/apache/log4j/xml/log4j.dtdहै कि चाल चलेगी, लेकिन यह प्रोटोकॉल भी समर्थन नहीं है (सत्यापन त्रुटि देखें)। मुझे डर है कि यह बॉक्स से बाहर काम नहीं करेगा।

और, जैसा कि मैंने समझा, SYSTEM "log4j.dtd"संकेतन कोई प्लेसहोल्डर नहीं है। यह एक दस्तावेज़ का एक वैध संदर्भ है जो dtd (इस मामले में) के बगल में मिलने की उम्मीद है।


मैं देख रहा हूं कि आप क्या कह रहे हैं, लेकिन यह एक समग्र संपत्ति है। हालाँकि, हमारे पास अलग-अलग परियोजनाएँ हैं (कुछ नहीं भी मावेन-परियोजनाएँ) और वे log4j के विभिन्न संस्करणों का उपयोग करते हैं। यह बहुत अच्छा होगा अगर मैं कुछ हद तक परियोजना के लिए विन्यास को बांध सकता हूं।
sjngm

यदि आप log4j के विभिन्न संस्करणों को कहते हैं - क्या आपका मतलब log4j.dtd के विभिन्न संस्करणों से है? आपको प्रत्येक संस्करण के लिए कैटलॉग प्रविष्टि को परिभाषित करना होगा। मुझे लगता है कि आप इस परियोजना के लिए विन्यास को बांधना चाहते हैं यह log4j.dtd के बगल में log4j.xml (परियोजना के अंदर) और <कोड> सिस्टम "log4j.dtd" की तुलना में सबसे अच्छा हो सकता है </ code> काम करना चाहिए (I आशा)।
FrVaBe

क्षमा करें, मेरा मतलब है log4j.jarएक पूरे के विभिन्न संस्करण । मुझे लगता है कि "log4j.dtd" कुछ प्रकार की जगह धारक है क्योंकि यह एक सामान्य नाम है। - हाँ, XML के बगल में log4j.dtd की प्रतिलिपि बनाना एक समाधान होगा, लेकिन क्या यह वास्तव में ऐसा करने का एक सामान्य तरीका है?
sjngm

1
और कृपया ध्यान दें कि हम यहां एक समाधान के बारे में बात कर रहे हैं जो मुख्य प्रश्न को लक्षित नहीं करता है।
sjngm

क्षमा करें, ध्यान नहीं दिया गया कि http संदर्भ ने काम किया है - मुझे लगता है कि यह सबसे अच्छा समाधान है - या आपके बयान के लिए दिए गए संदर्भ, SYSTEM "log4j.dtd" इसे करने का तरीका है
FrVaBe

2

मैंने webcontent में DTD फ़ोल्डर जोड़ा और फिर मैंने उस में log4j dtd फाइल कॉपी की। तब मैं bellow की तरह की कोशिश की। यह काम कर रहा है

<!DOCTYPE log4j:configuration SYSTEM "<Path>/DTD/log4j.dtd">

पाथ का मतलब है यहां प्रोजेक्ट पथ जैसा /projectname


1

मैंने FrVaBe के उत्तर के साथ कोशिश की है, लेकिन मेरे लिए काम नहीं किया और मैंने कुंजी मूल्य में एक छोटा सा परिवर्तन किया और यह काम करता है।

"वरीयताएँ -> XML -> XML कैटलॉग"

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN

1

@ जेक लेओव पब्लिक आईडी के साथ एक अच्छे दृष्टिकोण का उपयोग करता है। फिर भी, जैसा कि वह बताते हैं, इसके लिए एक नेटवर्क कनेक्शन की आवश्यकता होती है।

मुझे एक संयोजन पसंद है:

Entry element:      Public
Location:           org\apache\log4j\xml\log4j.dtd in jar file C:\Development\lib\external\apache-log4j-1.2.17\log4j-1.2.17.jar
URI:                jar:file:/C:/Development/lib/external/apache-log4j-1.2.17/log4j-1.2.17.jar!/org/apache/log4j/xml/log4j.dtd
Key type:           Public ID
Key:                -//APACHE//DTD LOG4J 1.2//EN

यह एक स्थानीय JAR का संदर्भ देता है, और पूर्ण URL के बिना DOCTYPE घोषणा का समर्थन करता है।

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">

-1

आमतौर पर, ग्रहण log4j.dtdक्लासपाथ में दिखता है और यह वहां नहीं मिलता है और इसलिए त्रुटि होती है। हम log4j.dtdनीचे की तरह फ़ाइल के लिए URL प्रदान करके इस समस्या को हल कर सकते हैं।

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

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