您的位置:首页 > 其它

Log4j配置学习文档之二 处理日滚文件-模拟实现

2017-04-19 13:56 393 查看

模拟实现

定义监听器,监听器启动的时候初始化定时器

监听器

package com.tcsoft.license.util;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* 系统启动时的监听类 初始化系统数据
*
* @author jhoneder
*
*/
public class InitListener implements ServletContextListener {

public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
// context销毁时,销毁初始化数据
}
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
try {
System.out.println("初始化监听...");
goTimer();
System.out.println("初始化完毕");
} catch (Exception e) {
System.out.println("失败:" + e.getMessage());
}
}
private void goTimer() {
Timer timmerTask = new Timer();
Calendar calEnviron = Calendar.getInstance();
// 每天的02:00.am开始执行
calEnviron.set(Calendar.HOUR_OF_DAY, 2);
calEnviron.set(Calendar.MINUTE, 00);
calEnviron.set(Calendar.SECOND, 00);
// date为制定时间
Date dateSetter = new Date();
dateSetter = calEnviron.getTime();
// nowDate为当前时间
Date nowDateSetter = new Date();
// 所得时间差为,距现在待触发时间的间隔
long intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();
if (intervalEnviron < 0) {
calEnviron.add(Calendar.DAY_OF_MONTH, 1);
dateSetter = calEnviron.getTime();
intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();
}
// 每24小时执行一次
timmerTask.schedule(new UseTimer(timmerTask), intervalEnviron, 1 * 1000 * 60 * 60 * 24);
}
}


定时器

package com.tcsoft.license.util;

import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;

import com.tcsoft.license.service.ApplicationService;

/**
* 被调用执行类
*
* @author Administrator
*
*/
public class UseTimer extends TimerTask {

Timer timer = new Timer();

String filename;
//默认按天
String datePattern = "'.'yyyy-MM-dd";

SimpleDateFormat sdf;
//最大保留日志数量
int maxBackupIndex = 7;

public UseTimer(){

}

public UseTimer(Timer timer) {
this.timer = timer;
}

public Timer getTimer() {
return timer;
}

public void setTimer(Timer timer) {
this.timer = timer;
}

/*
* 被调用具体的方法
*/
public void run() {
System.out.println("扫描日志文件...");
init();
//删除多余的log4j指定的日志文件
deleteOvermuchFile();
//删除其他后缀也为datePattern的日志文件
deleteLikeDatePatternLogFile();
}

//删除其他后缀也为datePattern的日志文件
public void deleteLikeDatePatternLogFile(){
//需要删除的[.日期]结尾的日志文件名
String[] fileNamesToDelete = {"localhost_access_log","catalina.out"};
for(String fn : fileNamesToDelete){
//重新赋值为新的日志文件名
this.filename = this.filename.substring(0,this.filename.lastIndexOf("/")+1)+fn;
deleteOvermuchFile();
}
}

/**
* 删除多余的log4j指定的日志文件
*/
public void deleteOvermuchFile(){

//获取名称为指定filename并且[.日期]结尾的日志文件
List<File> logFiles = getLogFiles();
//升序排序
sortFiles(logFiles);
//删除多余的日志文件
delete(logFiles);

}
//读取log4j配置 初始化一些成员变量
private void init(){
Properties log4jProp = new Properties();
try {
log4jProp.load(this.getClass().getResourceAsStream("/log4j.properties"));
this.filename = log4jProp.getProperty("log4j.appender.logfile.File");
String datePatternStr = log4jProp.getProperty("log4j.appender.logfile.DatePattern");
if(datePatternStr!=null && !"".equals(datePatternStr)){
datePattern = datePatternStr;
}

sdf = new SimpleDateFormat(datePattern);

String mbiStr = log4jProp.getProperty("log4j.appender.logfile.MaxBackupIndex");
if(mbiStr!=null && !"".equals(mbiStr)){
maxBackupIndex = Integer.parseInt(mbiStr);
}

String catalinaHome = System.getProperty("catalina.home");
if(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS")!=-1){
catalinaHome = catalinaHome.replaceAll("\\\\", "/");
}

filename = filename.replaceAll("\\$\\{catalina.home\\}", catalinaHome);

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NumberFormatException e){
System.out.println("maxBackupIndex数字异常!");
maxBackupIndex = 7;
}

}

private void delete(List<File> logFiles){
if (logFiles.size() > maxBackupIndex) {
for (int i = 0;i < logFiles.size() - maxBackupIndex;i++) {
logFiles.get(i).delete();
System.out.println("删除日志" + logFiles.get(i));
}
}
}

private List<File> getLogFiles(){
File logfile = new File(filename);
//获取日志文件的父目录
File logFolder = logfile.getParentFile();
//获取logs下的符合要求的日志文件
File[] logFiles = logFolder.listFiles(new FileFilter(){

@Override
public boolean accept(File pathname) {
try {
//如果是空串 则这个日志文件就是配置里写的OpenLog.log日志文件
if (getDateStr(pathname).isEmpty()) {
return true;
}
//截取的后缀字符串能够正常解析 则这个文件就是指定的日志文件加上日期的日志
sdf.parse(getDateStr(pathname));
return true;
} catch (ParseException e) {
//出异常了证明不是
return false;
}
}

});

return Arrays.asList(logFiles);
}
//按日志文件的后缀日期升序排序
private void sortFiles(List<File> fileList) {
Collections.sort(fileList, new Comparator<File>() {
public int compare(File o1, File o2) {
try {
if (getDateStr(o1).isEmpty()) {
return 1;
}
Date date1 = sdf.parse(getDateStr(o1));

if (getDateStr(o2).isEmpty()) {
return -1;
}
Date date2 = sdf.parse(getDateStr(o2));

if (date1.getTime() > date2.getTime()) {
return 1;
} else if (date1.getTime() < date2.getTime()) {
return -1;
}
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
});
}
//获取日志文件后缀的时间串
private String getDateStr(File file) {
if (file == null) {
return "null";
}
return file.getName().replaceAll(new File(filename).getName(), "");
}

}


测试实现

按上面的配置设置好之后(系统log4j加上MaxBackupIndex,localhost_access_log文件去掉后缀,catalina.out改成日滚文件)

先看下原来tomcat下日志文件是什么样的

系统配置的OpenLog.log



localhost_access_log



catalina.out



当定时器到了设定时间之后就会执行处理这三种文件的程序,删除多余的文件,删除之后的文件情况

系统配置的OpenLog.log



localhost_access_log



catalina.out



可以看到,这三种文件都只剩下我们在系统log4j里配置的MaxBackupIndex=7份,其余的时间比较早的文件已经被删除了,也就是只剩下时间比较近的日志文件!测试成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: