2011-04-10 4 views
8

Я использую log4j 1.2.15, и мне интересно, есть ли у кого-то средство для стратегии поиска переименования файла log4j.log4j стратегия переименования файлов

Я попробую объяснить: Я использую следующий RollingFileAppender, который создает 11 файлов журнала каждый размером 3 КБ.

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, чтобы сохранить суффикс «.log» , и создать, например, server.1.log?

Заранее спасибо Guy

ответ

1

Я делаю это с помощью конфигурации XML (может быть возможным без него) и Apache Extras Companion ™ для 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

Я использую почасовые итерации, полученные из Geoff Mottram-х 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 XML фрагмент код для кота (не делает обратитесь к часам, но вы можете понять это из моего кода):

<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> 
Смежные вопросы