文档章节

log4j 每次运行生成新文件 功能

-悟空-
 -悟空-
发布于 2014/11/21 09:32
字数 627
阅读 349
收藏 10
点赞 0
评论 0

开发中我有个需求就是,每次运行都生成新的log文件,因为我主要跑的测试,有些数据想比对还不想都放在一个文件中,这样查找起来不方便。在网上找了些发现log4j配置上没有办法满足我的需求,所以就写了个自定义类PerRunRollingFileAppender。

大致逻辑为:

读取配置文件中你配置文件的路径,遍历这个路径如果文件已经存在就重命名生成新的文件,哦对了,我这里还有在配置文件名前加了个前缀PerRunRollingFileAppender.LoggerNamePrefix,这样你可以在使用相同配置的时候,让每个测试类中生成的日志文件名不同。

只要在启动PropertyConfigurator.configure("./conf/log4j_default.properties");之前,配置PerRunRollingFileAppender.LoggerNamePrefix值就可以了。

note:有参考了他人代码,附上地址How to create a new log file for each time the application runs? ,但是他的可能没有测试,有个小bug,各位可以跑下亲自测下。

以下是我的代码:

package com.logger;

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;

public class PerRunRollingFileAppender extends FileAppender {

	public static String LoggerNamePrefix="default";
	private static final String DOT = ".";
	private static final String UNDERLINE="_";
	public PerRunRollingFileAppender() {
	}

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

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

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

	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);
			}
		}
	}

	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]+");  
			  
			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));
						}
					}
				}
			}
			
			
				
			if (dotIndex != -1) {
				// the file name has an extension. so, insert the time stamp
				// between the file name and the extension
				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);
        	}
              
        }  
    }  
}

配置文件:

log4j.logger.info=info
log4j.appender.info=com.logger.PerRunRollingFileAppender
log4j.appender.info.File=/mnt/log/info.log
log4j.appender.console.Threshold = DEBUG
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{hh:mm:ss}:%p %t  %l - %m%n

这样就可以啦,希望能帮助到其他人。

© 著作权归作者所有

共有 人打赏支持
-悟空-
粉丝 138
博文 25
码字总数 35562
作品 0
海淀
高级程序员
java 日志框架——log4j

Log4J是JAVA下的一款日志组件 下载: http://logging.apache.org/log4j/2.x/download.html 下面的示例我使用最新版本2.7无法正常运行,最新版本使用方法可能不同。本文示例使用log4j-1.2.15测...

xundh ⋅ 05/09 ⋅ 0

Java混乱的日志体系(logback)(转)

作为一名 Java 程序员,日常开发工作中肯定会接触日志系统,但是众多的框架,包括 Log4j、Log4j2、Logback、Slf4j、Apache Common logging 等等,引用的 maven 依赖众多,到底可以去掉哪些,...

easonjim ⋅ 2017/12/27 ⋅ 0

MyBatis3错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决

在使用Maven新建QuitStart类型项目时,引入了MyBatis3.2.0版本的JAR包之后,出现如下错误: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority Cause......

easonjim ⋅ 2017/06/19 ⋅ 0

Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转)

说明:内容估计有些旧,2011年的,但是大体意思应该没多大变化,最新的配置可以参考官方文档。 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块...

easonjim ⋅ 2017/11/07 ⋅ 0

Log4j 2.0在开发中的高级使用详解

log4j与slf4j、logback比较 而log4j slf4j logback就是目前主流的日志框架。但后两者效率高是第一个。推荐使用:slf4j 或者 logback(spring-boot默认日志实现) log4j是apache实现的一个开源日...

spinachgit ⋅ 04/22 ⋅ 0

使用代码形式配置Log4J日志框架

一、使用代码形式配置Log4J日志框架 一般情况下,我们都是使用配置文件形式来配置Log4J日志框架,比如使用“log4j.properties”文件。但有些时候,我们只是想简单快速使用Log4J日志框架,配置...

郭恩洲_OSC博客 ⋅ 05/28 ⋅ 0

日志部分,项目使用,面试不面的

Log4j.properties配置详解 一、Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。...

u012557298 ⋅ 01/01 ⋅ 0

你不知道的System.out.println()

这篇博客是为了解释System.out.println是什么以及它的工作原理。 什么是System.out.println() System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台。 System - 是 ...

为了美好的明天 ⋅ 2017/09/16 ⋅ 1

Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_log4j.htm 说明:示例基于Spring MVC 4.1.6。 以下示例说明如何使用Spring Web MVC框架来触发LOG4J。首先,让我们使用...

easonjim ⋅ 2017/09/10 ⋅ 0

spring boot保存|打印日志-logback的配置和使用

【转载】(https://www.cnblogs.com/winner-0715/p/6105519.html) 1.logback介绍 logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-classic和...

qq_25652949 ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 22分钟前 ⋅ 0

482. License Key Formatting - LeetCode

Question 482. License Key Formatting Solution 思路:字符串转化为char数组,从后遍历,如果是大写字母就转化为小写字母,如果是-就忽略,如果遍历了k个字符(排除-)就追加一个-。 Java实现...

yysue ⋅ 40分钟前 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 今天 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 今天 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 今天 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 今天 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 今天 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 今天 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部