2012-10-25 9 views
30

में कॉन्फ़िगरेशन फ़ाइल में फ़ाइल एपेंडर के लिए पर्यावरणीय परिवर्तनीय पथ कैसे देना है मेरे पास log4j.xml कॉन्फ़िगरेशन फ़ाइल है। और RollingFileAppender जिसमें मुझे लॉग स्टोर करने के लिए फ़ाइल पथ प्रदान करने की आवश्यकता है। समस्या यह है कि यूनिक्स मशीन पर एक रननेबल जार के रूप में मेरा कोड तैनात किया जाएगा। तो अगर मैं इस तरह पैरामीटर कुछ पारित:लॉग 4j

value=logs/messages.log" 

यह मेरे घर निर्देशिका के अंदर नामक फ़ोल्डर लॉग बनाता है और इस निर्देशिका के अंदर फाइल करने के लिए सभी संदेशों को लिखता है।

मेरे पास कुछ मूल्य पर एक पर्यावरणीय चर सेट है। मैं उस चर के पथ का उपयोग करना चाहता हूं और उस पथ के नीचे संदेश लिखना चाहता हूं। मैं इसे कैसे प्राप्त कर सकता हूं?

मैं इस का उपयोग कर की कोशिश की थी:

value="${MY_HOME}/logs/message.log" 

लेकिन यह काम नहीं करता। क्या कोई इस समस्या का समाधान सुझा सकता है?

+0

मुझे संदेह है कि यह केवल आपके घर का उपयोग कर रहा है ई निर्देशिका आधार के रूप में है क्योंकि यह जावा प्रक्रिया की वर्तमान कार्यशील निर्देशिका है ... –

उत्तर

38

जब इसकी कॉन्फ़िगरेशन फ़ाइल को पार्स करना, अभिव्यक्ति ${MY_HOME}सिस्टम प्रॉपर्टी नाम MY_HOME के मूल्य पर विस्तारित किया जाएगा, सिस्टम पर्यावरण चर नहीं है। दोनों के बीच एक अंतर है।

-DMY_HOME=$MY_HOME

कि जावा प्रणाली संपत्ति MY_HOME परिभाषित करेगा के मान होना चाहिए:

एक साफ तरह से इस लक्ष्य को हासिल करने के लिए आपको JVM मंगलाचरण लाइन के लिए कुछ इस तरह जोड़ना होगा पर्यावरण चर MY_HOME

+0

उत्तर के लिए धन्यवाद। क्या आप कृपया मुझे बताएं कि ऊपर दिए गए कथन को JVM आमंत्रण रेखा में कैसे जोड़ना है। –

+0

आपने उल्लेख किया था कि आपका कोड यूनिक्स मशीन पर एक रनने योग्य जार के रूप में तैनात है। कहीं आपकी यूनिक्स मशीन पर एक शेल स्क्रिप्ट (या ऐसा कुछ) है जो JAR फ़ाइल को आमंत्रित करता है ('जावा -जर myapp.jar', प्लस पैरामीटर का उपयोग करके); बस उस पंक्ति में '-DMY_HOME = $ MY_HOME' जोड़ें। – Isaac

+1

ओह ठीक है। मदद के लिए @Isaac धन्यवाद। तो इसका मतलब है कि मुझे अपनी एक्सएमएल फ़ाइल में किसी भी बदलाव की आवश्यकता नहीं है: यहां कोड है:

-1

चूंकि आप यूनिक्स का उपयोग कर रहे हैं, इसलिए आप इस तरह के पथ का उपयोग कर सकते हैं।

/home/Production/modulename/logs/message.log 

पथ/

+1

लेकिन ओपी पथ को नियंत्रित करने के लिए पर्यावरण चर का उपयोग करना चाहता है। – rolve

0

शायद साथ शुरू करना चाहिए ...:

datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz 
layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n 

# infoFile 
log4j.appender.infoFile=org.apache.log4j.RollingFileAppender 
log4j.appender.infoFile.File=${MY_HOME}/logs/message.log 
log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.infoFile.layout.ConversionPattern=${layout} 
+0

यह गुण फ़ाइल के लिए कोड होगा। $ {MY_HOME} /logs/message.log भी XML फ़ाइल के साथ काम करेगा। क्योंकि मैंने एक्सएमएल फाइल के साथ समान सामान का उपयोग करने की कोशिश की थी, लेकिन काम नहीं किया। –

-1

करने के लिए गतिशील रूप से परिवर्तित एक चर आप कुछ इस तरह कर सकते हैं:

String value = System.getenv("MY_HOME"); 
Properties prop = new Properties("log4j.properties"); 
prop.put("MY_HOME", value); // overwrite with value from environment 
PropertyConfigurator.configure(prop); 
+0

यह मेरी विन्यास फाइल के लिए है। यह काम करेगा, इसके साथ कोई समस्या नहीं है। लेकिन मैं जो चाहता हूं वह फ़ाइल एपेंडर पथ में $ MY_HOME पथ जोड़ना है, जिसका उपयोग मैं अपने एक्सएमएल कॉन्फ़िगरेशन फ़ाइल में संदेशों को लॉगिंग के लिए कर रहा हूं। –

+0

क्या मैं इस मामले में पूछ सकता हूं, मैं अपने जावा एप्लिकेशन में "MY_HOME" चर कैसे पारित कर सकता हूं। फिलहाल, मेरे पास कोड का निम्नलिखित भाग है "System.out.println (" सिस्टम MY_HOME: "+ System.getenv (" MY_HOME "));" लेकिन जब मैं ग्रहण से "MY_HOME" पास करने का प्रयास करता हूं, तो यह "सिस्टम MY_HOME: null" प्रिंट करता है -> चलाएं कॉन्फ़िगरेशन -> तर्क -> प्रोग्राम तर्क: -DMY_HOME = $ MY_HOME – user454083

+0

नई गुण (स्ट्रिंग) भी नहीं मौजूद?! तो इससे क्या मदद मिल सकती है? – Philipp

23

आप इसे पर्यावरण चर दे सकते हैं। बस env preppend: चर नाम से पहले, इस तरह:

value="${env:MY_HOME}/logs/message.log" 
+10

यह log4j 2.X के लिए है। 1.2.17 के लिए काम नहीं करता है ... – vikingsteve

+0

यह अंतिम जवाब है कि आप Log4j2 का उपयोग कर रहे हैं और पहले संस्करण नहीं। धन्यवाद! – russellhoff

+0

यह मेरे लिए काम करता है ... धन्यवाद @Inari –

2

java -DLOG_DIR=${LOG_DIR} -jar myjar.jar "param1" "param2" ==> cmd लाइन में यदि आप "value =" है $ {LOG_DIR} एक्सएमएल में /log/clientProject/project-error.log "

7

इस वाक्य रचना केवल log4j 2.x में दर्ज है तो सुनिश्चित करें कि आप सही संस्करण का उपयोग कर रहे हैं।

<Appenders> 
    <File name="file" fileName="${env:LOG_PATH}"> 
     <PatternLayout> 
      <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern> 
     </PatternLayout> 
    </File> 
</Appenders> 

http://logging.apache.org/log4j/2.x/manual/lookups.html#EnvironmentLookup

4

मैं इस काम के मिला है।

  1. मेरे log4j.properties में।मैं निर्दिष्ट

log4j.appender.file.File = $ {LogFilePath}

  1. ग्रहण में - JVM तर्क

-DLogFilePath = C: \ work \ MyLogFile.log

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