使用log4j设置日志生成方式及自定义日志名称

前言:log4j可以很方便的管理日志,除了按时间,按内容大小等之外生成日志,有时候我们希望能够自己设置日志的生成方法,比如每次运行程序即生成一个独立的日志,以及将日志名称按照自己的想法进行设置。

1:首先,这是我的log4j.properties的配置【日志路径后面是.log】

    log4j.rootLogger = ALL,logFile
    log4j.appender.logFile = org.apache.log4j.MyFileAppender
    log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
    log4j.appender.logFile.File = D:/temp/.log
    log4j.appender.logFile.Threshold = DEBUG
    log4j.appender.logFile.ImmediateFlush = TRUE
    log4j.appender.logFile.layout.ConversionPattern = %d{ABSOLUTE} %5p %c - %m%n
2:接下来我们看一下     org.apache.log4j.MyFileAppender   这个类的写法

package org.apache.log4j;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Layout;
import org.apache.log4j.spi.ErrorCode;
/**
 * FileAppender是log4j包中的类,这里需要继承它
 * @author tang
 */
 public class MyFileAppender extends FileAppender {

	public String LoggerNamePrefix = getCurrentClassName();
	private static final String DOT = ".";
	private static final String UNDERLINE = "_";

	public MyFileAppender() {
	}

	public MyFileAppender(Layout layout, String filename, boolean append,
			boolean bufferedIO, int bufferSize) throws IOException {
		super(layout, filename, append, bufferedIO, bufferSize);
	}

	public MyFileAppender(Layout layout, String filename, boolean append)
			throws IOException {
		super(layout, filename, append);
	}

	public MyFileAppender(Layout layout, String filename) throws IOException {
		super(layout, filename);
	}

	/**
	 * 这里获取执行主程序的类名,作为日志名称前缀
	 * @author tang
	 */
	public static String getCurrentClassName() {
		StackTraceElement[] ste = Thread.currentThread().getStackTrace();
		String className = ste[ste.length - 1].getClassName();
		int lastIndexOf = className.lastIndexOf(".") + 1;
		String currentClassName = className.substring(lastIndexOf);
		return currentClassName;
	}

	/**
	 * 父类方法 fileName路径后面有个.log
	 * @author tang
	 */
	public void activateOptions() {
		if (fileName != null) {
			try {
				fileName = getNewLogFileName();
				setFile(fileName, fileAppend, bufferedIO, bufferSize);
			} catch (Exception e) {
				errorHandler.error("Error while activating log options", e,
						ErrorCode.FILE_OPEN_FAILURE);
			}
		}
	}

	/**
	 * 获取下一个要生成的日志的全路径
	 * @return
	 */
	private String getNewLogFileName() {
		if (fileName != null) {
			final String LEFTPARENTHESIS = "(";
			final String RIGHTPARENTHESIS = ")";
			final File logFile = new File(fileName);
			final String fileName = logFile.getName();
			final int dotIndex = fileName.indexOf(DOT);
			String newFileName = "";
			Integer number = -1;
			File[] files = logFile.getParentFile().listFiles(new CustomFilter());
			Pattern pattern = Pattern.compile("(?<=\\()[\\d]+");
			// 首次创建为false
			if (files != null && files.length > 0) {
				number++;
				for (File file : files) {
					Matcher matcher = pattern.matcher(file.getName());
					if (matcher.find()) {
						if (number < Integer.valueOf(matcher.group(0))) {
							number = Integer.valueOf(matcher.group(0));
						}
					}
				}
			} else {
				// 避免首次名称bug,补充else
				number++;
			}
			// 设置日志名
			if (dotIndex != -1) {
				String tempFileName = fileName.substring(0, dotIndex);
				final int parenthesis = tempFileName.indexOf(LEFTPARENTHESIS);
				if (parenthesis != -1) {
					tempFileName = tempFileName.substring(parenthesis);
				}
				if (number > -1) {
					newFileName = LoggerNamePrefix + UNDERLINE + tempFileName
							+ LEFTPARENTHESIS + (++number) + RIGHTPARENTHESIS
							+ fileName.substring(dotIndex);
				} else {
					newFileName = LoggerNamePrefix + UNDERLINE + tempFileName
							+ fileName.substring(dotIndex);
				}
			} else {
				// 是否存在文件名中存在()
				if (number > -1) {
					newFileName = LoggerNamePrefix + UNDERLINE + fileName
							+ LEFTPARENTHESIS + (++number) + RIGHTPARENTHESIS;
				} else {
					newFileName = LoggerNamePrefix + UNDERLINE + fileName;
				}
			}
			// 格式化日志名
			return logFile.getParent() + File.separator + newFileName;
		}
		return null;
	}

	// 获取当年文件夹下的日志文件
	class CustomFilter implements FilenameFilter {

		public boolean accept(File dir, String name) {
			File logFile = new File(fileName);
			String fileName = logFile.getName();
			int indexDot = fileName.lastIndexOf(DOT);
			if (indexDot != -1) {
				return name.startsWith(LoggerNamePrefix + UNDERLINE
						+ fileName.substring(0, indexDot));
			} else {
				return name.startsWith(LoggerNamePrefix + UNDERLINE + fileName);
			}
		}
	}
}
3. 如果我们执行的主程序的类为MainTest.java,那么生成的日志文件如下所示【每次执行均生成一个】
MainTest_(1).log
MainTest_(2).log
MainTest_(3).log
MainTest_(4).log
MainTest_(5).log
好了,现在我们的日志就会随着我们主类名的不同而形成不同的日志文件了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值