Log4j 重写 RollingFileAppender 实现按日期生成文件夹文件名
Log4j 不支持按日期生成不同的文件夹,通过重写 RollingFileAppender 的 rollOver 、 genFileName 、 subAppend 、 setFile 方法,实现我们的需求(每日生成不同的文件夹,*/20190808/*.log),日志文件格式 info_20190808_01.log .
重写RollingFileAppender 类
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.text.SimpleDateFormat;
import java.util.Date;/** 通过重写 RollingFileAppender的rollOver、genFileName、subAppend、setFile 方法,实现我们的需求(每日生成不同的文件夹,* /2017103021/*.log),日志文件格式 pg_20171030_01.log .*/
public class Log4jRollingFileAppender extends RollingFileAppender {
private long nextRollover = 0;private static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");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) {// 删除序号最大(最早的文件)的文件/*file = new File(genFileName(fileName, maxBackupIndex));if (file.exists())renameSucceeded = file.delete();*/// 所有文件名序号加1for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {file = new File(genFileName(fileName, i));if (file.exists()) {target = new File(genFileName(fileName, i + 1));renameSucceeded = file.renameTo(target);}}if (renameSucceeded) {target = new File(genFileName(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);}}}private String genFileName(String name, int index) {String val = "_"+df.format(new Date())+"_";String fileName = "";if (index > 0) {String num = index < 10 ? "0" + index : String.valueOf(index);fileName = name.replace(".log", "") + val + num + ".log";} else {fileName = name;}return fileName;}protected void subAppend(LoggingEvent event) {super.subAppend(event);boolean flag = false;String[] _files = fileName.split("/");int len = _files.length;String file_name = _files[len-2];String new_file_name = df.format(new Date());if(!file_name.equals(new_file_name)){flag = true;fileName = fileName.replace(file_name, new_file_name);}if (fileName != null && qw != null) {long size = ((CountingQuietWriter) qw).getCount();if(flag){size = 0L;}if ((size >= maxFileSize && size >= nextRollover) || flag) {rollOver();}}}public void setFile(String file) {// Trim spaces from both ends. The users probably does not want// trailing spaces in file names.String val = file.trim();fileName = val.substring(0, val.lastIndexOf("/"))+"/"+df.format(new Date())+val.substring(val.lastIndexOf("/"), val.length());}
}
log4j.properties 代码块:
#log4j.rootCategory=debug,CONSOLE,D,I,W,E
log4j.rootCategory=debug,CONSOLE,logFile
########################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.encoding=UTF-8
log4j.appender.CONSOLE.layout.ConversionPattern=$PGFAST>[%d{MM-dd HH:mm:ss}][%-5p] %l >>>> <%m>%n
########################################################################
log4j.appender.logFile=com.thinkgem.jeesite.common.log4j.Log4jRollingFileAppender
log4j.appender.logFile.encoding=UTF-8
log4j.appender.logFile.File=${catalina.home}/logs/pg.log
log4j.appender.logFile.MaxFileSize=1KB
log4j.appender.logFile.MaxBackupIndex = 10
log4j.appender.logFile.Append = true
#log4j.appender.logFile.DatePattern='_'yyyyMMdd:HHmm:SSS'.log'
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=$PGFAST>[%d][%-5p] %l >>>> %m%n
效果
Log4j 重写 RollingFileAppender 实现按日期生成文件夹文件名相关推荐
- 日志 log4j按日期生成文件夹
期望结果:按日期生成文件夹,在最底层文件夹中记录日志,如:2019/03/11,在11这个文件夹下记录11号的日志,03和2019均为11的父文件夹. API:log4j 主要步骤:继承log4j的o ...
- 按日期生成文件夹,并删除之前的文件夹
//获取unix时间戳的当前时间 $addtime=date("ymd",time()); //创建文件夹 $testdir="./python/out/dada&quo ...
- 啊哈哈哈哈 C#按日期生成文件夹,并在文件夹中写入文件
我的天哪 我终于写出来了 using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...
- Excel与bat批量生成文件夹,修改文件夹名称
用Excel与bat批量生成文件夹,修改文件夹名称 一.批量生成文件夹 excel一列输入文件名序列:另一列用公式生成要写入bat文件的序列,之后复制该列写入.txt文件,保存为.bat文件,双击运行 ...
- java创建linux文件_Java生成文件夹
1.说明 判断文件夹是否存在,如果不存在就创建该文件夹,并打印其路径:如果存在,打印其路径 2.实现源码 /** * @Title:BuildFolder.Java * @Package:com.yo ...
- python如何生成excel文件夹_用python脚本通过excel生成文件夹树结构
大概这样写标题是对的吧... 目标: 通过excel目录结构文档生成文件夹树结构. 也就是: 通过下面的excel 生成下面的文档树结构: 方法: 1.分析:一般文档结构都是事先构思好.可以在txt文 ...
- linux文件自动改名,C#如何在生成文件夹或者文件时候自动重命名
C#如何在生成文件夹或者文件时候自动重命名 如果你在一个文件夹里面, 连续添加文件夹或者文件(不改名字), 那么系统会自动加上(1),(2),(3)... 这个效果我在网上搜不到, 自己写一下也不太难 ...
- python生成文件夹以及压缩文件夹
''' @Description 生成文件夹 @params (path) 文件夹路径 @params (title) 文件名称 @params (content) html 文件代码 @params ...
- 根据图片名字生成文件夹并归类+批量重命名照片名
最近在处理手头的部分图片数据,所以码了点code,也许质量不高,供大家参考, 欢迎各路大神纠正问题!! 1.该代码根据照片的名字来生成文件夹,并且将同类照片放置同一文件夹creat_dir.py #- ...
最新文章
- 精度首超ResNet,港科大和CMU提出史上最强二值化网络ReActNet
- 自考计算机科学与技术本科毕业论文选题,自考计算机科学与技术专业(本)毕业论文写作指导...
- 史迪仔的原型_星际宝贝三个版本对比,莉罗抛弃史迪仔,童年真的回不去了
- struts2权威指南学习笔记:struts2引入自定义库
- Javascript第三章数组Array常用方法第三课
- 安装SQL2000时弹出“以前的某个程序安装已在安装计算机上创建挂起的文件操作、、、”...
- ext数据库读取动态添加window组件
- Qt5.12 安装教程windows
- 石油化工行业SCM供应链管理系统开发,优化供应链平台运营模式
- java find 方法,findOne方法是findOne(Example
- 华硕飞行堡垒扬声器没声音_华硕玩游戏没声音_华硕飞行堡垒玩游戏卡
- 大数据的“多维度”与“时效性”
- 动态内存的申请和非动态内存的申请_公安交管新举措咋解读?非营运七座车6年免检,70岁可申请驾照...
- 阿里云的免费云虚拟主机
- Nexus搭建私服(记录)
- 思科、华为、瞻博juniper、中兴、阿尔卡特中高端网络设备查看端口收发光功率-命令汇总
- Php设计模式之【适配器模式 Adapter Pattern】
- php 的几种运行方式
- java闪光灯_手电筒项目开发一闪光灯
- 【论文翻译】-- GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition
热门文章
- Go语言占位符的使用
- 什么是海鸥脚网络变压器?普思海鸥脚H1102NL百兆网络变压器
- 【Python】爬取百度图片和必应图片
- C1认证学习笔记(第四章)
- Oracle 4月安全通告
- iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码...
- C语言对时间单位的换算
- 如何检验计算机主板的好坏,怎么判断笔记本主板、CPU硬件好坏? 查看电脑配置的教程...
- 趣学PYTHON 第一章python不是大蟒蛇
- 双显卡只用独显好吗_显卡有什么作用 独显和双显卡笔记本哪个好【详解】