package com.songy;
import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.lang.management.ManagementFactory;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ExRollingFileAppender extends RollingFileAppender{
private long nextRollover = 0;
private String level;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");
@Override
public void rollOver() {
File target;
File file;
if (qw != null) {
long size = ((CountingQuietWriter) qw).getCount();
nextRollover = size + maxFileSize;
}
LogLog.debug("maxBackupIndex=" + maxBackupIndex);
boolean renameSucceeded = true;
if (maxBackupIndex > 0) {
//计算当前日志文件夹下的文件数量是否超过阈值,超过则进行删除
countFile(fileName,maxBackupIndex);
// 所有文件名序号加1
for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
file = new File(getFileName(fileName,i));
if (file.exists()) {
target = new File(getFileName(fileName,i+1));
renameSucceeded = file.renameTo(target);
}
}
if (renameSucceeded) {
target = new File(getFileName(fileName,1));
this.closeFile();
file = new File(fileName);
renameSucceeded = file.renameTo(target);
if (!renameSucceeded) {
try {
this.setFile(fileName, true, bufferedIO, bufferSize);
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
LogLog.error("setFile(" + fileName + ", true) call failed.", e);
}
}
}
}
if (renameSucceeded) {
try {
this.setFile(fileName, false, bufferedIO, bufferSize);
nextRollover = 0;
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
LogLog.error("setFile(" + fileName + ", false) call failed.", e);
}
}
}
/**
*
* @Description: 获取日志文件名,文件名的格式为:coms_AUDIT_PC-20170705BLZI_2017122909_001.log
* 按照小时和文件大小进行日志文件的新增,首先判断当前文件是否在一小时内,如果在则判断大小是否超过设置值,如果超过则序号增加,创建新文件
* @author songy
* @date 2017年12月29日 上午11:02:34
*/
private String getFileName(String name,int i) {
String computerName = ManagementFactory.getRuntimeMXBean().getName();
String computers = computerName.split("@")[1];
String date = sdf.format(new Date());
String fileName = "coms_"+level+"_"+computers+"_"+date+"_";
String filePath = "";
int nums = 0;
String strNum = "";
if(name.indexOf("_") != -1){
String names = name.substring(name.lastIndexOf("_")+1, name.indexOf("."));
if(!"".equals(names) && names != null){
nums = Integer.parseInt(names);
}
}
nums= nums + i;
nums=nums==1000?1:nums;
strNum = nums>=10?(nums>=100?nums+"":"0"+nums):"00"+nums;
filePath = name.substring(0, name.lastIndexOf("/"));
fileName = filePath + "/" + fileName + strNum + ".log";
LogLog.debug("文件名:"+fileName);
return fileName;
}
@Override
protected void subAppend(LoggingEvent event) {
super.subAppend(event);
level = event.level.toString();
if (fileName != null && qw != null) {
long size = ((CountingQuietWriter) qw).getCount();
boolean flag = diffDate(fileName);
if ((size >= maxFileSize && size >= nextRollover) || flag) {
rollOver();
}
}
}
/**
*
* @Description: 根据文件名获取其中的时间,计算当前时间和文件名中的时间差,确定是否创建新文件
* 文件名当前的格式为:coms_AUDIT_PC-20170705BLZI_2017122909_001.log
* @author songy
* @date 2017年12月29日 上午10:48:21
* @param name 日志文件名
*/
public static boolean diffDate(String name){
boolean flag = false;
long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
long nh = 1000 * 60 * 60;// 一小时的毫秒数
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhh");
if(name.indexOf("_") != -1){
//first_name截取后的字符串为coms_AUDIT_PC-20170705BLZI_2017122909
String first_name = name.substring(0,name.lastIndexOf("_"));
if(first_name.indexOf("_") != -1){
String second_name = first_name.substring(first_name.lastIndexOf("_")+1, first_name.length());
try {
Date file_time = sdf.parse(second_name);
Date current_time = new Date();
long diff = current_time.getTime() - file_time.getTime();
long hour = diff % nd / nh;
if(hour >= 1){
flag = true;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
*
* @Description: 计算日志文件个数,当达到最大保留数时,将最早生成的日志文件删除
* @author songy
* @date 2017年12月29日 下午1:54:30
* @param fileName 文件名称(包括路径)
*/
public static void countFile(String fileName,int maxBackupIndex){
String filePath = fileName.substring(0, fileName.lastIndexOf("/"));
LogLog.debug("日志文件夹:"+filePath);
File file = new File(filePath);
if(file.isDirectory()){
File[] files = file.listFiles();
if(files.length > maxBackupIndex){
DelLogFile.filePath = filePath;
//删除文件时单独启动一个线程进行
new DelLogFile().start();
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
log4j自定义日志文件名及日志输出格式
共30个文件
class:7个
java:5个
xml:4个
3星 · 超过75%的资源 需积分: 48 59 下载量 95 浏览量
2018-01-15
16:10:33
上传
评论
收藏 21KB RAR 举报
温馨提示
根据项目需要,要求日志文件名及输出的日志内容头为特殊的格式,因此重写了log4j的一些方法,如要求的格式和项目不同,可根据示例参考进行再次的修改
资源推荐
资源详情
资源评论
收起资源包目录
LogTest.rar (30个子文件)
LogTest
.project 1KB
pom.xml 3KB
target
test-classes
m2e-wtp
web-resources
META-INF
maven
com.test.songy
LogTest
pom.xml 3KB
pom.properties 214B
MANIFEST.MF 115B
classes
log4j.properties 861B
com
songy
ExRollingFileAppender.class 5KB
LogTest.class 2KB
DelLogFile.class 2KB
ExPatternParser$ExPatternConverter.class 1KB
ExPatternParser.class 878B
ExPatternLayout.class 645B
DelLogFile$1.class 957B
.settings
.jsdtscope 639B
org.eclipse.wst.common.component 746B
org.eclipse.wst.validation.prefs 50B
org.eclipse.jdt.core.prefs 430B
org.eclipse.wst.common.project.facet.core.xml 252B
org.eclipse.wst.jsdt.ui.superType.container 49B
org.eclipse.m2e.core.prefs 90B
org.eclipse.wst.jsdt.ui.superType.name 6B
src
test
java
main
resources
log4j.properties 861B
java
com
songy
LogTest.java 2KB
DelLogFile.java 2KB
ExPatternParser.java 2KB
ExRollingFileAppender.java 7KB
ExPatternLayout.java 483B
webapp
WEB-INF
web.xml 222B
index.jsp 57B
.classpath 1KB
共 30 条
- 1
资源评论
- 普通网友2018-06-26在尝试。。。
Edward_S_Y
- 粉丝: 9
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功