2010-05-11 11 views
15

में एपेंडर में गतिशील फ़ाइल नाम कैसे दें I लॉग जानकारी के लिए log4j का उपयोग कर रहा हूं। मैंने लॉग फ़ाइलों को बनाने के लिए log4j.xml फ़ाइल का उपयोग किया है। मैंने प्रत्येक लॉग फ़ाइल के लिए param टैग मान के रूप में पूर्ण पथ दिया है।log4j.xml

उदा .:

<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="DatePattern" value="'_'yyyyMMdd"/> 
    <param name="File" value="D:/logFiles/GPreprocessor.log"/> 
    <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/> 
</appender> 

मैं "GPreprocessor.log" लिखने के लिए सीधे नहीं करना चाहती। असल में, मेरे प्रोजेक्ट के नाम के आधार पर, वह फ़ाइल नाम गतिशील है। उदाहरण के लिए, यदि मैं प्रोग्राम ABC.java चलाता हूं, तो लॉगिंग D:/logFiles/ABC.log पर जाना चाहिए, लेकिन यदि मैं XYZ.java चलाता हूं, तो लॉगिंग D:/logFiles/XYZ.log पर जाना चाहिए। फ़ाइल का स्थान हमेशा वही रहेगा: D:/logFiles/। मैं लॉग फ़ाइल के नाम को गतिशील रूप से कैसे बदल सकता हूं?

log4j.xml में $ के रूप में चर को परिभाषित {चर}:

<appender name="FILE" class="org.apache.log4j.FileAppender">  
    <param name="File" value="${logfilename}.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d::[%t]::%-5p::%c::%x - %m%n" /> 
    </layout>  
</appender> 

तो सुनिश्चित करें कि आप सिस्टम गुण सेट बनाने के लिए जब आप इस तरह के रूप में अपने JVM शुरू

उत्तर

65

यह निम्न करने के लिए बहुत आसान है :

java -Dlogfilename=my_fancy_filename example.Application 

कि एक गतिशील लॉग फ़ाइल नाम पैदा करेगा: my_fancy_filename.log

वैकल्पिक रूप से, आप सिस्टम प्रॉपर्टी को तब तक कोड में सेट कर सकते हैं जब तक आप लॉगर बनाने से पहले ऐसा करते हैं (यह उपयोगी है यदि आप उदाहरण के लिए अपने लॉग में अपने पीआईडी ​​चाहते हैं)। जैसे:

System.setProperty("logfilename", "a_cool_logname"); 

एक बार है कि सेट किया गया है आप आगे जाना है और सामान्य तौर पर अपने वालों मिलता है और वे (उन स्थिर संग्रह करने वालों कि वालों बनाने से पहले अपने मुख्य विधि कार्यान्वित की सावधान रहना) गतिशील फाइल करने के लिए लॉग इन करेंगे कर सकते हैं।

+1

की तरह फ़ाइल परम के मूल्य विशेषता में log_dir संपत्ति का उपयोग करेगा यह समर्थन/ले अगर मैं में मान देते हैं।गुण फ़ाइल? यानी, JVM की शुरुआत में मान को परिभाषित करने के बजाय, क्या मैं इसे .properties फ़ाइल में परिभाषित कर सकता हूं? – SuRa

+0

यदि आप System.setProperty ("logfilename", "a_cool_logname") का उपयोग करते हैं; सुनिश्चित करें कि आप कुछ भी लॉग इन करने से पहले इसे सेट करें – James

4

यह आपकी खुद की कक्षा के साथ FileAppender का विस्तार करने के लिए अधिक समझ में आता है, जिसमें आप setOptions() विधि को ओवरराइड करते हैं। फिर अपने log4j.properties में आप yourpackage.yourFileAppender पर लॉग इन करने के लिए रूट कॉन्फ़िगर करते हैं, जो कि अधिक क्लीनर है।

2

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

public class LogClass { 

    private static Logger log = Logger.getLogger(LogClass.class); 
    private static boolean initializationFlag = false; 
    private static String fileName; 

    private static void intializeLogger(){ 
     log.setLevel(Level.DEBUG); 

     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     Date date = new Date(); 

     RollingFileAppender appender = new RollingFileAppender(); 
     appender.setAppend(true); 
     appender.setMaxFileSize("1MB"); 
     appender.setMaxBackupIndex(1); 
     appender.setFile(fileName + "_" + dateFormat.format(date) + ".log"); 

     PatternLayout layOut = new PatternLayout(); 
     layOut.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"); 
     appender.setLayout(layOut); 

     log.addAppender(appender); 
    } 

    public static Logger getLogger(){ 
     if(initializationFlag == false){ 
      intializeLogger(); 
      initializationFlag = true; 
      return LogClass.log; 
     } 
     else{ 
      return LogClass.log; 
     } 
    } 

    public static void setFileName(String fileName){ 
     LogClass.fileName = fileName; 
    } 
} 

अब आप अपने कार्यक्रम में लकड़हारा उपयोग करने के लिए, बस इन दो पंक्तियों को लिखने चाहते हैं कि जब भी:

LogClass.setFileName(yourFileName); 
LogClass.getLogger().debug("hello!!"); 

मुबारक कोडिंग।

0

आपकी कक्षा में मुख्य विधि वाले कुछ वर्ग में आपकी कक्षा का नाम कुछ सिस्टम प्रॉपर्टी पर सेट किया गया है। निम्नलिखित उदाहरण में मैंने संपत्ति नाम के रूप में log_dir का उपयोग किया।

class ABC{ 
public static void main(String s[]){ 
    System.setProperty("log_dir", ABC.class.getSimpleName()); 
} 
} 

और अपने log4j.xml फ़ाइल में

<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="DatePattern" value="'_'yyyyMMdd"/> 
    <param name="File" value="D:/logFiles/${log_dir}"/> 
    <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/> 
</appender> 

वर्क्स एक आकर्षण

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