自定义log4j日志文件命名规则是什么
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,小编给大家分享一下自定义log4j日志文件命名规则是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!自定义log4j日志
千家信息网最后更新 2025年01月31日自定义log4j日志文件命名规则是什么
小编给大家分享一下自定义log4j日志文件命名规则是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
自定义log4j日志文件命名规则
项目中的日志需要采用一致的命名规范和文件规范,命名规则为:项目模块标识_index_日期时间_日志级别.log,且每个级别日志文件放在单独的文件夹,且每个文件夹下日志的数量不得超过10个,当数量超过限制时,删除相对较旧的日志,保留较新的日志。
但是发现log4j并不能满足此要求,于是
根据log4j的API定义自己的FileAppender
代码如下:
package com.dear.simpler.dbrpc.util.log; import java.io.File;import java.io.IOException;import java.io.InterruptedIOException;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Comparator;import java.util.Date;import java.util.concurrent.atomic.AtomicInteger;import java.util.regex.Matcher;import java.util.regex.Pattern; import org.apache.log4j.RollingFileAppender;import org.apache.log4j.helpers.CountingQuietWriter;import org.apache.log4j.helpers.LogLog;import org.apache.log4j.spi.LoggingEvent;/**; * * @author lixiang * 自定义log文件的命名规则 */public class MyLogFileAppender extends RollingFileAppender { private long nextRollover = 0; private static AtomicInteger logIndex = new AtomicInteger(0); //index public void rollOver() { File file = null; if (qw != null) { long size = ((CountingQuietWriter) qw).getCount(); LogLog.debug("rolling over count=" + size); // if operation fails, do not roll again until // maxFileSize more bytes are written nextRollover = size + maxFileSize; } LogLog.debug("maxBackupIndex=" + maxBackupIndex); if (maxBackupIndex > 0) { file = new File(getRollingFileName(fileName, logIndex.incrementAndGet())); if (fileExisted(file)){ file = new File(getRollingFileName(fileName, logIndex.incrementAndGet())); } deleteOldFile(file.getParentFile(), maxBackupIndex); this.closeFile(); } try { this.setFile(getRollingFileName(fileName, logIndex.get()), 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 getRollingFileName(String fileName, int index) { //使用正则表达式替代index Pattern p = Pattern.compile("_\\d+\\_"); Matcher m=p.matcher(fileName); String str = m.replaceFirst(String.format("_%d_", index)); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); //日期 String dateString = format.format(new Date(System.currentTimeMillis())); str = str.replaceAll("\\d{14}", dateString); return str; } public synchronized void setFile(String fileName, boolean append, //修改文件名 boolean bufferedIO, int bufferSize) throws IOException { SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); //日期 String dateString = format.format(new Date(System.currentTimeMillis())); String temp = String.format(fileName , dateString); //文件名 super.setFile(temp, append, bufferedIO, bufferSize); if(append) { File f = new File(temp); ((CountingQuietWriter)this.qw).setCount(f.length()); } } private boolean fileExisted(File file){ boolean res = false; String[] fts = file.getName().split("_"); File parentFile = file.getParentFile(); for(File f : parentFile.listFiles()){ String[] fns = f.getName().split("_"); if(fns[0].equals(fts[0]) && fns[1].equals(fts[1])){ res = true; break; } } return res; } private void deleteOldFile(File dir , int maxInt){ if(getFileNum(dir) >= maxBackupIndex ){ File[] files = orderByDate(dir); for (int i = 0; i <= files.length - maxBackupIndex; i++) { File f = files[i]; f.delete(); } } } private int getFileNum(File file){ return file.list().length; } //将文件按日期排序 public File[] orderByDate(File dir) { File[] fs = dir.listFiles(); Arrays.sort(fs,new Comparator< File>(){ @Override public int compare(File f1, File f2) { long diff = f1.lastModified() - f2.lastModified(); if (diff > 0) return 1; else if (diff == 0) return 0; else return -1; } @Override public boolean equals(Object obj) { return true; } }); return fs; } @Override protected void subAppend(LoggingEvent event) { super.subAppend(event); if (fileName != null && qw != null) { long size = ((CountingQuietWriter) qw).getCount(); if (size >= maxFileSize && size >= nextRollover) { rollOver(); } } } }
对应的log4j.properties的配置文件如下
### set log levels ### log4j.rootLogger = out,E,I #log4j.logger.com.dear.simpler.dbrpc.util.log.TestUtil=out,Dlog4j.appender.D = com.dear.simpler.dbrpc.util.log.MyLogFileAppender log4j.appender.D.File = ../../logs/db_logs/debug/DB_0_%s_debug.loglog4j.appender.D.Append = truelog4j.appender.D.MaxFileSize=1024MBlog4j.appender.D.MaxBackupIndex=10log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = com.dear.simpler.dbrpc.util.log.ExPatternLayout log4j.appender.D.layout.ConversionPattern = [%d{yyyy/MM/dd HH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%nlog4j.appender.E = com.dear.simpler.dbrpc.util.log.MyLogFileAppender log4j.appender.E.File = ../../logs/db_logs/error/DB_0_%s_error.log log4j.appender.E.Append = truelog4j.appender.E.MaxFileSize=10MBlog4j.appender.E.MaxBackupIndex=10log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = com.dear.simpler.dbrpc.util.log.ExPatternLayout log4j.appender.E.layout.ConversionPattern = [%d{yyyy/MM/dd HH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%n log4j.appender.I = com.dear.simpler.dbrpc.util.log.MyLogFileAppender log4j.appender.I.File = ../../logs/db_logs/info/DB_0_%s_info.log log4j.appender.I.Append = true log4j.appender.I.MaxFileSize=10MBlog4j.appender.I.MaxBackupIndex=10log4j.appender.I.Threshold = INFO log4j.appender.I.layout = com.dear.simpler.dbrpc.util.log.ExPatternLayout log4j.appender.I.layout.ConversionPattern = [%d{yyyy/MM/dd HH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%n
输出的日志文件命名如下
log4j自定义生成文件的名称
我们在使用Log4j的RollingFileAppender循环生成文件的时候,生成的文件的名称有点儿恶心,例如,文件名称为app.log,那么生成的文件名依次为app.log.1,app.log.2,....
那么如何去改变生成文件的名称的规则呢?下面是一个简单示例:
log4j.properties
log4j.logger.major= INFO, majorMsglog4j.additivity.logError = falselog4j.appender.majorMsg=com.zws.log.MyRollingFileAppenderlog4j.appender.majorMsg.File=${catalina.home}/logs/itc/majorMsg.loglog4j.appender.majorMsg.layout=org.apache.log4j.PatternLayoutlog4j.appender.majorMsg.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}|%p|%C|%M|%L|%m%nlog4j.appender.majorMsg.MaxFileSize=1KBlog4j.appender.majorMsg.MaxBackupIndex=10
MyRollingFileAppender.java
package com.zws.log;import java.io.File;import java.io.IOException;import java.io.InterruptedIOException;import org.apache.log4j.Priority;import org.apache.log4j.RollingFileAppender;import org.apache.log4j.helpers.CountingQuietWriter;import org.apache.log4j.helpers.LogLog;import org.apache.log4j.spi.LoggingEvent;/** * * @author wensh.zhu * */public class MyRollingFileAppender extends RollingFileAppender { private long nextRollover = 0; 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(); //所有文件名序号加1 for (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 fileName = ""; if (index > 0) { String num = index < 10 ? "0" + index : String.valueOf(index); fileName = name.replace(".log", "") + "_" + num + ".log"; } else { fileName = name; } return fileName; } protected void subAppend(LoggingEvent event) { super.subAppend(event); if (fileName != null && qw != null) { long size = ((CountingQuietWriter) qw).getCount(); if (size >= maxFileSize && size >= nextRollover) { rollOver(); } } }}
以上是"自定义log4j日志文件命名规则是什么"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
文件
日志
规则
文件名
生成
日期
名称
篇文章
内容
序号
数量
文件夹
级别
项目
最大
一致
恶心
不怎么
代码
大部分
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全类厂商
数据库潜在的安全问题
浙江网络技术服务客户至上
政府网络安全态势
零创互联网科技
石油行业网络安全解决方案
剑灵现在有几个服务器
我的世界网易版服务器基本需求
链接到当前数据库
生态图谱软件开发
上海专业的进销存软件开发教程
web服务器的配置管理
怎么清理linux服务器磁盘
建党100周年网络安全预案
零基础编程软件开发
合肥安科网络技术有限公司
安全访问云服务器地址
交流服务器可以用直流电吗
用友数据库一键
安安分期服务器异常怎么办
软件开发凭证
数据库连接错误 代码 01
计算机专业包括网络安全吗
软件开发女孩子学难吗
福建推广软件开发销售价格
四川哪个服务器安全
任城软件开发价格
维基解密 数据库
软件开发市场部
网络安全驱动机会