DailyRollingFileAppender-设置文件大小和备份天数
感谢:http://byx5185.iteye.com/blog/1616034
1、重写FileAppender :
package com.bankht.cis.tps.apps.tps.util; import org.apache.log4j.FileAppender;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.spi.LoggingEvent; import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TreeMap; /**
* 名称: TraceLogFileAppender.java<br>
* 描述: 该appender是仿照log4j中RollingFileAppender写的
* 可配置备份天数,包含当天
* filesize为字节数<br>
* 批次:name<br>
* 创建时间: 2018年7月23日<br>
* 修改时间:<br>
* 编写人员:xxx <br>
* 版本号:1.0
*/ public class CustomTraceLogFileAppender extends FileAppender { protected long maxFileSize = 10485760L;//file.length,字节数
protected int maxDaysIndex = 1;//备份天数,包含当天 private long nextRollover = 0;
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
private static String separator = "."; public CustomTraceLogFileAppender() {} public CustomTraceLogFileAppender(Layout layout, String filename, boolean append)
throws IOException
{
super(layout, filename, append);
} public CustomTraceLogFileAppender(Layout layout, String filename)
throws IOException
{
super(layout, filename);
}
public int getMaxDaysIndex(){return maxDaysIndex;} public long getMaximumFileSize()
{
return maxFileSize;
} public void setMaxDaysIndex(int maxDays)
{
maxDaysIndex = maxDays;
} public void setMaximumFileSize(long maxFileSize)
{
this.maxFileSize = maxFileSize;
} public void setMaxFileSize(String value)
{
maxFileSize = OptionConverter.toFileSize(value, maxFileSize + 1L);
} protected void setQWForFiles(Writer writer)
{
qw = new CustomCountingQuietWriter(writer, errorHandler,this.encoding);
} //启动时专用
public synchronized void setFile(String fileName, boolean append,
boolean bufferedIO, int bufferSize) throws IOException {
String temp = getStartupFileName(fileName);
super.setFile(temp, append, this.bufferedIO, this.bufferSize);
if (append) {
File f = new File(temp);
((CustomCountingQuietWriter)qw).setCount(f.length());
}
//每次启动时,检验是否超出备份数量,超出则删除最旧日期
countFile(temp,maxDaysIndex);
} private String getStartupFileName(String name) {
String filePath = name.substring(0,name.lastIndexOf("/")+1);
String[] strs = name.split("\\.");
File[] files = new File(filePath).listFiles(new CustomLogStartupFileFilter(strs[1])); //treemap默认是升序,取最后一个即为最新文件.
TreeMap<Long, String> treeMap = new TreeMap<Long, String>();
if(files==null || files.length == 0){
if(strs.length==3){
StringBuffer sb = new StringBuffer();
String now = sdf.format(new Date());
return sb.append(strs[0]).append(separator)
.append(strs[1]).append(separator)
.append(now).append(separator)
.append("1").append(separator).append("log").toString();
}
return name;
}else{
for(File temp : files){
treeMap.put(temp.lastModified(),temp.getPath());
}
name = treeMap.lastEntry().getValue();
String now = sdf.format(new Date());
String[] strs1 = name.split("\\.");
if(strs1.length == 5){//符合日志文件名格式
StringBuffer sb = new StringBuffer();
if(now.equals(strs1[2])){
return sb.append(strs[0]).append(separator)
.append(strs1[1]).append(separator)
.append(strs1[2]).append(separator)
.append(strs1[3]).append(separator).append("log").toString();
}else{
return sb.append(strs[0]).append(separator)
.append(strs1[1]).append(separator)
.append(now).append(separator)
.append("1").append(separator).append("log").toString();
}
}
}
return name;
} public synchronized void setCustomFile(String fileName, boolean append,
boolean bufferedIO, int bufferSize) throws IOException {
super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
if (append) {
File f = new File(fileName);
((CustomCountingQuietWriter)qw).setCount(f.length());
}
} protected void subAppend(LoggingEvent event) {
String nowDate = sdf.format(new Date());
String[] strs = fileName.split("\\.");
String fileDate = strs[2];
if(!nowDate.equals(fileDate)){
try {
//新建文件,当切换日期时,文件名中的序号都是从1开始
String newFileName = getFileName(fileName,1);
this.setCustomFile(newFileName, true, bufferedIO, bufferSize);
//计算备份天数,多出删掉
countFile(newFileName,maxDaysIndex);
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
}
}
super.subAppend(event);//先写入数据
if ((fileName != null) && (qw != null)) {
long size = ((CustomCountingQuietWriter)qw).getCount();
if ((size >= maxFileSize) && (size >= nextRollover)) {
this.closeFile();
fileName = getFileName(fileName,1);
try {
this.setCustomFile(fileName, true, bufferedIO, bufferSize);
nextRollover = 0;
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
}
}
}
} /**
* 系统名称.实例名称.日期.文件编号.log
* @param name
* @param i
* @return
*/
private static String getFileName(String name,int i) {
String date = sdf.format(new Date());
String filePath = name.substring(0, name.lastIndexOf("/")+1);
String currentName = name.substring(name.lastIndexOf("/")+1);
String[] str = currentName.split("\\.");
if(str.length>=3){//启动时,文件名:系统名.实例名.log,长度为3
String fileName = "";
fileName = str[0]+separator+str[1]+separator+date+separator;
int nums = 0;
if(str.length==5){
String num = str[3];
String fileDate = str[2];
if(!"".equals(num) && num != null && date.equals(fileDate)){
nums = Integer.parseInt(num);
}
}
nums= nums + i; fileName = filePath + fileName + nums + ".log";
name = fileName;
}
return name;
}
/**
* 获取几天前的日期,格式yyyyMMdd
* @param days 天数
* @return
*/
public static String getBeforeDate(int days){
Calendar cal = Calendar.getInstance();
cal.add(cal.DATE, -days);
Date resultDate = cal.getTime();
return sdf.format(resultDate);
} /**
*
* @param fileName 文件名称(包括路径)
* @param MaxDaysIndex 计算日志文件个数,当达到最大保留数时,将最早生成的日志文件删除
*/
public static void countFile(String fileName,int MaxDaysIndex){
String delDate = getBeforeDate(MaxDaysIndex);
String filePath = fileName.substring(0, fileName.lastIndexOf("/"));
File file = new File(filePath);
if(file.isDirectory()){
File[] files = file.listFiles(new CustomLogFileFilter(delDate));
if(files != null && files.length>0){
for(File temp:files){
temp.delete();
}
}
}
} } /**
* 文件过滤器
* 删除文件时专用
*/
class CustomLogFileFilter implements FileFilter {
private String delDate; public CustomLogFileFilter(String delDate) {
this.delDate = delDate;
} /**
*
* @param file 路径+文件名
* @return
*/
@Override
public boolean accept(File file) {
if (delDate == null || file.isDirectory()) {
return false;
} else {
String[] strs = file.getName().split("\\.");
if(strs!=null && strs.length>=3){
if(strs[2].compareTo(delDate)<=0){//删除备份天数之前的文件
return true;
}
}
return false;
}
}
}
class CustomLogStartupFileFilter implements FileFilter {
private String serverName; public CustomLogStartupFileFilter(String serverName) {
this.serverName = serverName;
} /**
*
* @param file 路径+文件名
* @return
*/
@Override
public boolean accept(File file) {
//过滤文件夹中符合系统名称.实例名称.日期.文件编号.log格式的文件,实例名与当前实例名一致.
if(file.getName().split("\\.").length == 5 && serverName.equals(file.getName().split("\\.")[1])){
return true;
}
return false;
}
}
2、
package com.bankht.cis.tps.apps.tps.util; import org.apache.log4j.helpers.QuietWriter;
import org.apache.log4j.spi.ErrorHandler; import java.io.IOException;
import java.io.Writer; /**
* 重写CustomCountingQuietWriter
* 计算长度时,设置字符级
* Created by xxx on 2018/7/24.
*/
public class CustomCountingQuietWriter extends QuietWriter {
protected long count;
protected String encoding; public CustomCountingQuietWriter(Writer writer, ErrorHandler eh, String encoding) {
super(writer, eh);
this.encoding = encoding;
} public void write(String string) {
try {
this.out.write(string);
this.count += (long)string.getBytes(this.encoding).length;
} catch (IOException var3) {
this.errorHandler.error("Write failure.", var3, 1);
} } public long getCount() {
return this.count;
} public void setCount(long count) {
this.count = count;
}
}
2、 log4j.properties文件中配置:
其中CustomTraceLogFileAppender为重写的FileAppender。
MaxFileSize 文件大小
MaxDaysIndex 备份天数
# Set root logger level to DEBUG and its only appender to CONSOLE.
log4j.rootLogger=INFO,log #CONSOLE
#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n #route trace log
log4j.appender.log=org.apache.log4j.RollingFileAppender
log4j.appender.log.File=/route/route-trace-${log.name}.log
log4j.appender.log.MaxFileSize=200000KB
log4j.appender.log.MaxBackupIndex=200
log4j.appender.log.layout=org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}[%t][%c][%p]-%m%n #SQL
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.Statement=INFO
log4j.logger.java.sql.PreparedStatement=INFO
log4j.logger.java.sql.ResultSet=INFO #trace log
log4j.logger.traceLog=INFO,traceLog
log4j.additivity.traceLog=false
log4j.appender.traceLog=com.bankht.cis.tps.apps.tps.util.CustomTraceLogFileAppender
log4j.appender.traceLog.Append=true
log4j.appender.traceLog.MaxFileSize=20480KB
log4j.appender.traceLog.MaxDaysIndex=7
log4j.appender.traceLog.encoding=UTF-8
log4j.appender.traceLog.File=/route/tracelog/GCSC-D.${log.name}.log
log4j.appender.traceLog.layout=org.apache.log4j.PatternLayout
log4j.appender.traceLog.layout.ConversionPattern=%m%n
DailyRollingFileAppender-设置文件大小和备份天数的更多相关文章
- YourSQLDba设置共享路径备份
YourSQLDba可以将数据库备份到网络路径(共享路径),这个也是非常灵活的一个功能,以前一直没有使用过这个功能,最近由于一个需求,于是我测试了一下YourSQLDba备份到网络路径,中间遇到了一些 ...
- editplus如何设置不自动备份
依次选择:工具,参数设置,文件(默认展开的,要缩回),然后看右边“保存文件时创建备份”,前面的框不要打勾,应用,确定
- crontab的相关设置&linux定时备份数据库
对于才了解crontab的人来说,应该按照以下的步骤来设置crontab 1.首先要检查是否装了crontab http://blog.sina.com.cn/s/blog_4881040d01011 ...
- windows环境设置mysql自动备份(测试成功)
00.背景介绍 最近做了个小程序,使用的是mysql数据库,涉及到将程序数据备份的事:虽然大部分数据库客户端工具都具有备份功能,但并不能做到定期自动备份:在Windows环境下,手工备份MySQL是很 ...
- Linux_Centos7_设置MySql定时备份
一.查看是否安装了必要的组件 [root@localhost /]# rpm -qa | grep cron cronie-1.4.11-14.el7_2.1.x86_64 cronie-anacro ...
- chrome设置以及hosts备份
最近重装完chrome总是忘记改了哪些设置,所以这里做一下备份. 有卡顿问题可以关闭GPU加速 使用https的方式访问Google,Chrome下强制Google使用https的方法如下: 打开Ch ...
- Linux设置数据库自动备份
本文为转载,最末端为原地址 以CentOS 7.6系统与Oracle 11g为例: 一.先找到数据库的环境变量 如果是在root账户下,须先登录到数据库所在账户 su oraclecat ~/.bas ...
- struts文件上传拦截器maximumSize设置文件大小不起作用
<interceptor-ref name="fileUpload"> <param name="allowedTypes ...
- 在WINDOWS服务器下设置MARIADB自动备份的方法
WINDOWS服务器下自动备份有三个步骤 1.首先新建一个.BAT文件里面输入 @echo offset "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" ...
随机推荐
- 深度学习常用的数据源(MNIST,CIFAR,VOC2007系列数据)
MINIST手写数据集 压缩包版: http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz http://yann.lecun.com/ ...
- 初学C#之运算符和关系表达式
㈠运算符和关系表达式 一元运算符++.-- 前加和后加区别,事例++在后如下: ; ; //结果age=19 说明age++在表达式中age的值也+1.结果sum=8,原因age++,++在后用age ...
- python语法基础-并发编程-进程-进程池以及回调函数
############### 进程池 ############## """ 进程池的概念 为什么会有进程池? 1,因为每次开启一个进程,都需要创建一个内存空间 ...
- python编程:从入门到实践----第五章:if语句>练习
5-1 条件测试 :编写一系列条件测试:将每个测试以及你对其结果的预测和实际结果都打印出来. a. 详细研究实际结果,直到你明白了它为何为True 或False b. 创建至少2个测试,且其中结果分别 ...
- git的基础使用
GIT """ 什么是git:版本控制器 - 控制的对象是开发的项目代码 代码开发时间轴:需求1 > 版本库1 > 需求2 > 版本库2 > 版本 ...
- Hadoop_课堂笔记1
1.课程目标 实践性 2.课下需要 在家搭建一个伪分布式 3.大数据概念和意义 08年Nature第一次正式提出大数据概念 常规的数据库:结构化的数据库 TB级的结构化数据管理就很困难,需要分布式 当 ...
- 0x10 - PostgreSQL 安装之 CentOS7 + Patroni
PostgreSQL + CentOS7 + Patroni 背景 PostgreSQL 的高可用环境 环境 CentOS 7 pg01 (192.168.1.120) pg02 (192.168.1 ...
- PCA|factor extraction|CA
PCA:主成分分析 相关矩阵,找特征值,找每个特征值对应特征向量,即组成主组成式子: 每个式子指向一个结果y,找一条线将这些y分开.有11个变量就有11个新坐标轴,通过点到直线距离来区分. 信息必须集 ...
- 2017NOIP模拟赛三 A酱的体育课
据说改编自$CodeM 美团点评编程大赛初赛A 轮$ 简单的水题...考试的时候没想到,xjb打了暴力. 显然,第$x$个人排在第$y$个位置的情况总数为$(n-1)!$,在这些情况中,第$x$人对答 ...
- DataSet,DataTable排序(转载)
DataSet,DataTable排序 关于对已经绑定的DataSet的排序的问题: DataSet ds=new DataSet();DataView dv=new DataView();dv. ...