2011-04-10 19 views
8

मैं log4j 1.2.15 का उपयोग कर रहा हूं और मुझे आश्चर्य है कि किसी को कष्टप्रद फ़ाइल नामकरण रणनीति log4j का उपयोग करने का कोई उपाय है या नहीं।log4j फ़ाइल नामकरण रणनीति

मैं समझाने की कोशिश करूंगा: मैं निम्नलिखित रोलिंगफाइलएपेंडर का उपयोग कर रहा हूं जो प्रत्येक 3KB आकार में 11 लॉग फ़ाइलों को बनाता है।

log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File = server.log log4j.appender.logfile.MaxFileSize = 3KB log4j.appender.logfile.MaxBackupIndex = 10

समस्या यह है कि एक नया लॉग फ़ाइल बनाने के दौरान, log4j server.log.1, server.log.2 आदि पैदा करता है ...

मैं log4j "लॉग" प्रत्यय रखने के लिए कॉन्फ़िगर कर सकते हैं , और उदाहरण के लिए server.1.log बनाएँ?

अग्रिम लड़का

उत्तर

1

मैं इस एक xml विन्यास का उपयोग कर कर रहा हूँ धन्यवाद Apache log4j ™ (log4j के लिए एक अतिरिक्त पुस्तकालय) के लिए और अपाचे अतिरिक्त कंपेनियन (बिना संभव हो सकता है) ™। मुझे नहीं लगता कि यह अतिरिक्त के बिना काम करता है, लेकिन यह हो सकता है।

कुंजी FileNamePattern का उपयोग करना है।

<appender name="logger" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <rollingPolicy class="org.apache.log4j.rolling.FixedWindowRollingPolicy"> 
     <param name="FileNamePattern" value="/server.%i.log" /> 
     <param name="MaxIndex" value="10" /> 
    </rollingPolicy> 

    <triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy"> 
     <param name="MaxFileSize" value="3000" /> 
    </triggeringPolicy> 
</appender> 
+0

तेज़ उत्तर के लिए धन्यवाद। मैंने पहले से ही कोशिश की लेकिन यह काम नहीं करता है, मुझे डर है कि गुण फ़ाइल में FileNamePattern काम नहीं करता है। क्या कोई इसे स्वीकार कर सकता है? धन्यवाद – Guy

0

घंटेभर यात्रा ज्योफ मॉट्रैम के Dated File Appender इस प्रकार है, जो आपको एक उदाहरण एक नामकरण रणनीति प्राप्त करने के लिए के रूप में उपयोग कर सकते हैं के रूप में से प्राप्त का उपयोग करें; FileAppender के स्रोत की जाँच करें और संलग्न विधि में देखने को देखने के लिए जहां यह फ़ाइल आकार की जाँच करता है, तो अपने ही वर्ग है जो ठीक से नाम बदलने संभालती साथ FileAppender ओवरराइड:

package com.fredcheese.log4j; 

import java.io.File; 
import java.util.Calendar; 
import java.util.Date; 

import org.apache.log4j.FileAppender; 
import org.apache.log4j.spi.LoggingEvent; 

/** 
* Based on biz.minaret.log4j.DatedFileAppender, 
* decompiled with JAD, 
* revised to use optional hours. 
*/ 
public class DistinctDailyFileAppender extends FileAppender { 

public static final String DEFAULT_DIRECTORY = "logs"; 
public static final String DEFAULT_SUFFIX = ".txt"; 
public static final String DEFAULT_PREFIX = ""; 

private String directory = DEFAULT_DIRECTORY; 
private String prefix = DEFAULT_PREFIX; 
private String suffix = DEFAULT_SUFFIX; 
private File currentPath = null; 
private Calendar currentCalendar = null; 
private long nextTime = 0l; 
private boolean hourly = false; 

/** 
* Constructor. 
*/ 
public DistinctDailyFileAppender() {} 

/** 
* This method is automatically called once by the system, 
* immediately after all properties are set, prior to release. 
*/ 
public void activateOptions() { 

    currentPath = new File(directory); 
    if (!currentPath.isAbsolute()) {   
     errorHandler.error("Directory failure for appender [" + name + "] : " + directory); 
     return; 
    } 

    currentPath.mkdirs(); 

    // We can write; initialize calendar 
    if (currentPath.canWrite()) { 
     currentCalendar = Calendar.getInstance(); 
    } else { 
     errorHandler.error("Cannot write for appender [" + name + "] : " + directory); 
     return; 
    }  
} 

/** 
* This is called, synchronized by parent. 
*/ 
public void append(LoggingEvent event) { 

    if (layout == null) { 
     errorHandler.error("No layout set for appender [" + name + "]."); 
     return; 
    } 

    if (currentCalendar == null) { 
     errorHandler.error("Improper initialization for appender [" + name + "]."); 
     return; 
    } 

    long nowTime = System.currentTimeMillis(); 
    if (nowTime >= nextTime) { 
     currentCalendar.setTime(new Date(nowTime)); 
     String timestamp = generateTimestamp(currentCalendar); 
     nextCalendar(currentCalendar); 
     nextTime = currentCalendar.getTime().getTime(); 
     File file = new File(currentPath, prefix + timestamp + suffix); 
     fileName = file.getAbsolutePath(); 
     super.activateOptions(); 
    } 

    if (super.qw == null) { 

     errorHandler.error("No output stream or file set for the appender named [" + name + "]."); 
     return; 

    } else { 

     subAppend(event); 
     return; 

    } 
} 

protected String generateTimestamp(Calendar calendar) { 

    int year = calendar.get(Calendar.YEAR); 
    int month = calendar.get(Calendar.MONTH) + 1; 
    int day = calendar.get(Calendar.DAY_OF_MONTH); 
    int hour = calendar.get(Calendar.HOUR_OF_DAY); 
    int minutes = calendar.get(Calendar.MINUTE); 
    int seconds = calendar.get(Calendar.SECOND); 

    StringBuffer buffer = new StringBuffer(); 

    if (year < 1000) { 
     buffer.append('0'); 
     if (year < 100) { 
      buffer.append('0'); 
      if (year < 10) { 
       buffer.append('0'); 
      } 
     } 
    } 
    buffer.append(Integer.toString(year)); 
    buffer.append('-'); 

    if (month < 10) { 
     buffer.append('0'); 
    } 
    buffer.append(Integer.toString(month)); 
    buffer.append('-'); 

    if (day < 10) { 
     buffer.append('0'); 
    } 
    buffer.append(Integer.toString(day)); 
    buffer.append('_'); 

    if (hour < 10) { 
     buffer.append('0'); 
    } 
    buffer.append(Integer.toString(hour)); 

    if (minutes < 10) { 
     buffer.append('0'); 
    } 
    buffer.append(Integer.toString(minutes)); 

    if (seconds < 10) { 
     buffer.append('0'); 
    } 
    buffer.append(Integer.toString(seconds)); 

    return buffer.toString(); 
} 

protected void nextCalendar(Calendar calendar) { 
    int i = calendar.get(Calendar.YEAR); 
    int j = calendar.get(Calendar.MONTH); 

    if (hourly) { 
     int k = calendar.get(Calendar.DAY_OF_MONTH); 
     int l = calendar.get(Calendar.HOUR_OF_DAY) + 1; 
     calendar.clear(); 
     calendar.set(i, j, k, l, 0); 
    } else { 
     int k = calendar.get(Calendar.DAY_OF_MONTH) + 1; 
     calendar.clear(); 
     calendar.set(i, j, k); 
    } 
} 

public String getDirectory() { 
    return directory; 
} 

public void setDirectory(String directory) { 
    if (directory == null || directory.length() == 0) { 
     this.directory = "."; // Set to here 
    } else { 
     this.directory = directory; 
    } 
} 

public String getPrefix() { 
    return prefix; 
} 

public void setPrefix(String prefix) { 
    if (prefix == null) { 
     this.prefix = DEFAULT_PREFIX; // Set to default 
    } else { 
     this.prefix = prefix; 
    } 
} 

public String getSuffix() { 
    return suffix; 
} 

public void setSuffix(String suffix) { 
    if (suffix == null) { 
     this.suffix = ""; // Set to empty, not default 
    } else { 
     this.suffix = suffix; 
    } 
} 

public void setHourly(boolean hourly) { 
    this.hourly = hourly; 
} 

public boolean isHourly() { 
    return this.hourly; 
} 
} 

यहाँ बिल्ला के लिए मेरी appender एक्सएमएल टुकड़ा है (ऐसा नहीं करता घंटों का संदर्भ लें, लेकिन आप इसे मेरे कोड से समझ सकते हैं):

<appender name="PRIMARY_APPENDER" class="com.fredcheese.log4j.DistinctDailyFileAppender"> 
    <param name="Threshold" value="DEBUG"/> 
    <param name="Directory" value="X:\\apps\\logs\\cheese\\"/> 
    <param name="Append" value="true"/> 

    <param name="Prefix" value="appname_log."/> 
    <param name="Suffix" value=".txt"/> 

    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%.3t] %-14.14c{1} %m%n"/> 
    </layout> 
</appender>