使用log4j设置日志生成方式及自定义日志名称
2018-01-27 15:18
295 查看
前言:log4j可以很方便的管理日志,除了按时间,按内容大小等之外生成日志,有时候我们希望能够自己设置日志的生成方法,比如每次运行程序即生成一个独立的日志,以及将日志名称按照自己的想法进行设置。
1:首先,这是我的log4j.properties的配置【日志路径后面是.log】
2:接下来我们看一下 org.apache.log4j.MyFileAppender 这个类的写法
3. 如果我们执行的主程序的类为MainTest.java,那么生成的日志文件如下所示【每次执行均生成一个】
好了,现在我们的日志就会随着我们主类名的不同而形成不同的日志文件了。
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产生日志,使用自定义日志名称
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat下使用Log4j 接管 catalin 4000 a.out 日志文件按天生成方式
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式:
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式,按天存放,解决catalina.out日志文件过大问题
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式,按天存放
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- java整合log4j xml 配置 自定义日志文件路径和生成年月日的html文件
- 自定义toast时,有些时候不能设置想要的宽和高(代码动态设置或使用文末方式)
- Java使用自定义的tableModel,设置可编辑方式
- log4j使用心得之一 -- 自定义日志级别并分不同文件存储
- Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译。
- Log4j自定义生成文件的名称
- hibernate中使用log4j日志框架设置