Log4j 重写 RollingFileAppender 实现按日期生成文件夹文件名

 

<span style="color:#ff0000">Log4j 不支持按日期生成不同的文件夹</span>

 

通过重写 RollingFileAppender  的 rollOver 、 genFileName 、 subAppend 、 setFile 方法,实现我们的需求(每日生成不同的文件夹,*/2017103021/*.log),日志文件格式 pg_20171030_01.log .

 

/**  
 * Copyright ©2017 DarkFOX. All rights reserved.
 *
 * @Title: Log4JRollingFileAppender.java
 * @Prject: PGFAST
 * @Package: com.pg.core.log4j
 * @Description: TODO
 * @author: ETFox
 * @date: 2017年10月30日 下午2:37:17
 * @version: V1.0
 */
package com.etfox.demofactory;

import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;

/**
 * @ClassName: Log4JRollingFileAppender
 * @Description: TODO 重写 log4j RollingFileAppender,实现文件输出自定义名称
 * @author: ETFox
 * @date: 2017年10月30日 下午2:37:17
 */
public class Log4jRollingFileAppender extends RollingFileAppender {

	private long nextRollover = 0;
	
	private static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
	
	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();*/
			
			// 所有文件名序号加1
			for (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 val = "_"+df.format(new Date())+"_";
		String fileName = "";
		if (index > 0) {
			String num = index < 10 ? "0" + index : String.valueOf(index);
			fileName = name.replace(".log", "") + val + num + ".log";
		} else {
			fileName = name;
		}
		return fileName;
	}

	protected void subAppend(LoggingEvent event) {
		super.subAppend(event);
		boolean flag = false;
		String[] _files = fileName.split("/");
		int len = _files.length;
        String file_name = _files[len-2];
        String new_file_name = df.format(new Date());
        if(!file_name.equals(new_file_name)){
            flag = true;
            fileName = fileName.replace(file_name, new_file_name);
        }
		if (fileName != null && qw != null) {
			long size = ((CountingQuietWriter) qw).getCount();
			if(flag){
			    size = 0L;
			}
			if ((size >= maxFileSize && size >= nextRollover) || flag) {
				rollOver();
			}
		}
	}
	
	public void setFile(String file) {
	    // Trim spaces from both ends. The users probably does not want
	    // trailing spaces in file names.
	    String val = file.trim();
	    fileName = val.substring(0, val.lastIndexOf("/"))+"/"+df.format(new Date())+
	    		val.substring(val.lastIndexOf("/"), val.length());
	}
	
}

 

 

log4j.properties 代码块:

 

#log4j.rootCategory=debug,CONSOLE,D,I,W,E
log4j.rootCategory=debug,CONSOLE,logFile
########################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.encoding=UTF-8
log4j.appender.CONSOLE.layout.ConversionPattern=$PGFAST>[%d{MM-dd HH:mm:ss}][%-5p] %l >>>> <%m>%n
########################################################################
log4j.appender.logFile=com.etfox.demofactory.Log4jRollingFileAppender
log4j.appender.logFile.encoding=UTF-8
log4j.appender.logFile.File=${catalina.home}/logs/pg.log
log4j.appender.logFile.MaxFileSize=1KB
log4j.appender.logFile.MaxBackupIndex = 10
log4j.appender.logFile.Append = true
#log4j.appender.logFile.DatePattern='_'yyyyMMdd:HHmm:SSS'.log'
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=$PGFAST>[%d][%-5p] %l >>>> %m%n

 

 

 

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
RollingFileAppenderlog4j中的一个Appender。它可以将日志信息输出到文件中,并且可以控制日志文件的大小和数量。 RollingFileAppender有以下的属性: 1. File:设置日志输出的文件名,可以使用相对或绝对路径,例如:log.txt。 2. Append:设置是否在文件的末尾添加日志信息,如果为true,则在文件末尾添加,否则会覆盖原有的文件。 3. Threshold:设置日志输出的级别,只有大于等于这个级别的日志信息才会被输出。 4. MaxFileSize:设置日志文件的大小,超过这个大小后就会生成一个新的日志文件。 5. MaxBackupIndex:设置保留的日志文件数量,超过这个数量后就会删除最旧的日志文件。 下面是一个RollingFileAppender的配置示例: ``` log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender log4j.appender.rollingFile.File=log.txt log4j.appender.rollingFile.Append=true log4j.appender.rollingFile.Threshold=DEBUG log4j.appender.rollingFile.MaxFileSize=10MB log4j.appender.rollingFile.MaxBackupIndex=5 log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.rollingFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n ``` 这个配置示例中,RollingFileAppender文件名为log.txt,设置了在文件末尾添加日志信息,只有大于等于DEBUG级别的日志信息才会被输出,日志文件大小为10MB,保留5个日志文件。最后的PatternLayout用于设置日志信息的输出格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值