您的位置:首页 > 编程语言 > Java开发

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

2018-01-27 15:18 295 查看
前言: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

好了,现在我们的日志就会随着我们主类名的不同而形成不同的日志文件了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java log4j 日志 格式化