標籤:log4j 檔案名稱 自訂
我們在使用Log4j的RollingFileAppender迴圈組建檔案的時候,產生的檔案的名稱有點兒噁心,例如,檔案名稱為app.log,那麼產生的檔案名稱依次為app.log.1,app.log.2,....
那麼如何去改變組建檔案的名稱的規則呢?下面是一個簡單樣本:
1,log4j.properties
log4j.logger.major= INFO, majorMsglog4j.additivity.logError = falselog4j.appender.majorMsg=com.zws.log.MyRollingFileAppenderlog4j.appender.majorMsg.File=${catalina.home}/logs/itc/majorMsg.loglog4j.appender.majorMsg.layout=org.apache.log4j.PatternLayoutlog4j.appender.majorMsg.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}|%p|%C|%M|%L|%m%nlog4j.appender.majorMsg.MaxFileSize=1KBlog4j.appender.majorMsg.MaxBackupIndex=10
2,MyRollingFileAppender.java
package com.zws.log;import java.io.File;import java.io.IOException;import java.io.InterruptedIOException;import org.apache.log4j.Priority;import org.apache.log4j.RollingFileAppender;import org.apache.log4j.helpers.CountingQuietWriter;import org.apache.log4j.helpers.LogLog;import org.apache.log4j.spi.LoggingEvent;/** * * @author wensh.zhu * */public class MyRollingFileAppender extends RollingFileAppender {private long nextRollover = 0;public void rollOver() {File target;File file;if (qw != null) {long size = ((CountingQuietWriter) qw).getCount();nextRollover = size + maxFileSize;}LogLog.debug("maxBackupIndex=" + maxBackupIndex);boolean renameSucceeded = true;if (maxBackupIndex > 0) {//刪除序號最大(最早的檔案)的檔案file = new File(genFileName(fileName, maxBackupIndex));if (file.exists())renameSucceeded = file.delete();//所有檔案名稱序號加1for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {file = new File(genFileName(fileName, i));if (file.exists()) {target = new File(genFileName(fileName, i + 1));renameSucceeded = file.renameTo(target);}}if (renameSucceeded) {target = new File(genFileName(fileName, 1));this.closeFile(); file = new File(fileName);renameSucceeded = file.renameTo(target);if (!renameSucceeded) {try {this.setFile(fileName, true, bufferedIO, bufferSize);} catch (IOException e) {if (e instanceof InterruptedIOException) {Thread.currentThread().interrupt();}LogLog.error("setFile(" + fileName + ", true) call failed.", e);}}}}if (renameSucceeded) {try {this.setFile(fileName, false, bufferedIO, bufferSize);nextRollover = 0;} catch (IOException e) {if (e instanceof InterruptedIOException) {Thread.currentThread().interrupt();}LogLog.error("setFile(" + fileName + ", false) call failed.", e);}}}private String genFileName(String name, int index) {String fileName = "";if (index > 0) {String num = index < 10 ? "0" + index : String.valueOf(index);fileName = name.replace(".log", "") + "_" + num + ".log";} else {fileName = name;}return fileName;}protected void subAppend(LoggingEvent event) {super.subAppend(event);if (fileName != null && qw != null) {long size = ((CountingQuietWriter) qw).getCount();if (size >= maxFileSize && size >= nextRollover) {rollOver();}}}}
以上樣本將檔案名稱的建置規則為:如果檔案名稱為app.log,那麼後續的檔案為app_01.log,app_02.log.
本文出自 “埃文” 部落格,請務必保留此出處http://wenshengzhu.blog.51cto.com/5151285/1712913
Log4j自訂組建檔案的名稱