log4j-在RollingFileAppender基础上为日志文件添加时间戳

log4j-在RollingFileAppender基础上为日志文件添加时间戳

  1. 修改后的代码
package com.xxx.adapter.util.logUtil;

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

import org.apache.log4j.helpers.CountingQuietWriter;

import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.LogLog;

public class MyLogAppend extends RollingFileAppender {
	
	private String datePattern = "'.'yyyy-MM-dd";
			
	public void setDatePattern(String pattern) {
		datePattern = pattern;
	}

	/** Returns the value of the <b>DatePattern</b> option. */
	public String getDatePattern() {
		return datePattern;
	}		

	@SuppressWarnings("unused")
	private long nextRollover = 0;

	public // synchronization not necessary since doAppend is alreasy synched
	void rollOver() {
		File target;
		File file;

		if (qw != null) {
			long size = ((CountingQuietWriter) qw).getCount();
			LogLog.debug("rolling over count=" + size);
			// if operation fails, do not roll again until
			// maxFileSize more bytes are written
			nextRollover = size + maxFileSize;
		}
		LogLog.debug("maxBackupIndex=" + maxBackupIndex);

		boolean renameSucceeded = true;
		// If maxBackups <= 0, then there is no file renaming to be done.
		if (maxBackupIndex > 0) {
			String[] dateStr = new SimpleDateFormat(datePattern).format(new Date()).split("\\.");
			// Delete the oldest file, to keep Windows happy.
			file = new File(fileName + dateStr[0] + '.' + maxBackupIndex + '.' + dateStr[dateStr.length - 1]);
//			if (file.exists()) renameSucceeded = file.delete();
			
			delmaxBackupIndexFile(fileName);

			// Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
			for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
				
				file = regexFiles(fileName, i);
				
				if (file.exists()) {
					// log.log_2018-12-12.2.log
					target = new File(fileName + dateStr[0] + '.' + (i + 1) + '.' + dateStr[dateStr.length - 1]);
					LogLog.debug("Renaming file " + file + " to " + target);
					renameSucceeded = file.renameTo(target);
				}
				
//				file = new File(fileName + "." + i);
//				if (file.exists()) {
//					target = new File(fileName + '.' + (i + 1));
//					LogLog.debug("Renaming file " + file + " to " + target);
//					renameSucceeded = file.renameTo(target);
//				}
			}

			if (renameSucceeded) {
				// Rename fileName to fileName.1
				target = new File(fileName + dateStr[0] + "." + 1 + '.' + dateStr[dateStr.length - 1]);

				this.closeFile(); // keep windows happy.

				file = new File(fileName);
				LogLog.debug("Renaming file " + file + " to " + target);
				renameSucceeded = file.renameTo(target);
				//
				// if file rename failed, reopen file with append = true
				//
				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 all renames were successful, then
		//
		if (renameSucceeded) {
			try {
				// This will also close the file. This is OK since multiple
				// close operations are safe.
				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);
			}
		}
	}
	
	
	
	
	
	public void delmaxBackupIndexFile(String directoryPath) {
		File file = regexFiles(directoryPath, maxBackupIndex);
		if (file.exists()) {
			file.delete();
		}
	}
	
	public File regexFiles(String directoryPath, int index) {
		directoryPath = directoryPath.replaceAll("\\\\", "/");
		String[] str = directoryPath.split("/");
		directoryPath = directoryPath.substring(0, directoryPath.lastIndexOf(str[str.length - 1]) - 1);
		File baseFile = new File(directoryPath);
		if (baseFile.isFile() || !baseFile.exists()) {
			return new File("not exist this file");
		}
		File[] files = baseFile.listFiles();
		for (File file : files) {
			if (file.isFile()) {
				String fileName = file.getAbsolutePath();
				int start = fileName.lastIndexOf(".");
				String _str = fileName.substring(start - 1, start);
				if (String.valueOf(index).equals(_str)) {
					return file;
				}
			}
				
		}
		return new File("not exist this file");
	}
	

}

  1. log4j.properties
log4j.appender.file=com.xxx.adapter.util.logUtil.MyLogAppend
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.File=${catalina.home}/xxx-logs/log.log
log4j.appender.file.DatePattern = '_'yyyy-MM-dd'.log'
log4j.appender.file.MaxFileSize=100MB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout = org.apache.log4j.PatternLayout 
log4j.appender.file.Append = true
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss}  [ %t\:%r ] - [ %p ]  %m%n
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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用于设置日志信息的输出格式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值