自定义log4j日志文件命名规则是什么(log4j,开发技术)

时间:2024-05-06 02:34:15 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

自定义log4j日志文件命名规则

项目中的日志需要采用一致的命名规范和文件规范,命名规则为:项目模块标识_index_日期时间_日志级别.log,且每个级别日志文件放在单独的文件夹,且每个文件夹下日志的数量不得超过10个,当数量超过限制时,删除相对较旧的日志,保留较新的日志。

但是发现log4j并不能满足此要求,于是

根据log4j的API定义自己的FileAppender

代码如下:

packagecom.dear.simpler.dbrpc.util.log;importjava.io.File;importjava.io.IOException;importjava.io.InterruptedIOException;importjava.text.SimpleDateFormat;importjava.util.Arrays;importjava.util.Comparator;importjava.util.Date;importjava.util.concurrent.atomic.AtomicInteger;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.log4j.RollingFileAppender;importorg.apache.log4j.helpers.CountingQuietWriter;importorg.apache.log4j.helpers.LogLog;importorg.apache.log4j.spi.LoggingEvent;/**;**@authorlixiang*自定义log文件的命名规则*/publicclassMyLogFileAppenderextendsRollingFileAppender{privatelongnextRollover=0;privatestaticAtomicIntegerlogIndex=newAtomicInteger(0);//indexpublicvoidrollOver(){Filefile=null;if(qw!=null){longsize=((CountingQuietWriter)qw).getCount();LogLog.debug("rollingovercount="+size);//ifoperationfails,donotrollagainuntil//maxFileSizemorebytesarewrittennextRollover=size+maxFileSize;}LogLog.debug("maxBackupIndex="+maxBackupIndex);if(maxBackupIndex>0){file=newFile(getRollingFileName(fileName,logIndex.incrementAndGet()));if(fileExisted(file)){ file=newFile(getRollingFileName(fileName,logIndex.incrementAndGet()));}deleteOldFile(file.getParentFile(),maxBackupIndex);this.closeFile();}try{this.setFile(getRollingFileName(fileName,logIndex.get()),false,bufferedIO,bufferSize);nextRollover=0;}catch(IOExceptione){if(einstanceofInterruptedIOException){Thread.currentThread().interrupt();}LogLog.error("setFile("+fileName+",false)callfailed.",e);}}privateStringgetRollingFileName(StringfileName,intindex){//使用正则表达式替代indexPatternp=Pattern.compile("_\\d+\\_");Matcherm=p.matcher(fileName);Stringstr=m.replaceFirst(String.format("_%d_",index));SimpleDateFormatformat=newSimpleDateFormat("yyyyMMddHHmmss");//日期StringdateString=format.format(newDate(System.currentTimeMillis()));str=str.replaceAll("\\d{14}",dateString);returnstr;}publicsynchronizedvoidsetFile(StringfileName,booleanappend,//修改文件名booleanbufferedIO,intbufferSize)throwsIOException{ SimpleDateFormatformat=newSimpleDateFormat("yyyyMMddHHmmss");//日期StringdateString=format.format(newDate(System.currentTimeMillis()));Stringtemp=String.format(fileName,dateString);//文件名super.setFile(temp,append,bufferedIO,bufferSize);if(append){Filef=newFile(temp);((CountingQuietWriter)this.qw).setCount(f.length());}}privatebooleanfileExisted(Filefile){ booleanres=false; String[]fts=file.getName().split("_"); FileparentFile=file.getParentFile(); for(Filef:parentFile.listFiles()){ String[]fns=f.getName().split("_"); if(fns[0].equals(fts[0])&&fns[1].equals(fts[1])){ res=true; break; } } returnres;}privatevoiddeleteOldFile(Filedir,intmaxInt){ if(getFileNum(dir)>=maxBackupIndex){ File[]files=orderByDate(dir); for(inti=0;i<=files.length-maxBackupIndex;i++){ Filef=files[i]; f.delete(); } }}privateintgetFileNum(Filefile){ returnfile.list().length;}//将文件按日期排序publicFile[]orderByDate(Filedir){File[]fs=dir.listFiles();Arrays.sort(fs,newComparator<File>(){ @Override publicintcompare(Filef1,Filef2){ longdiff=f1.lastModified()-f2.lastModified(); if(diff>0) return1; elseif(diff==0) return0; else return-1; } @Override publicbooleanequals(Objectobj){ returntrue; }});returnfs;}@OverrideprotectedvoidsubAppend(LoggingEventevent){super.subAppend(event);if(fileName!=null&&qw!=null){longsize=((CountingQuietWriter)qw).getCount();if(size>=maxFileSize&&size>=nextRollover){rollOver();}}}}

对应的log4j.properties的配置文件如下

###setloglevels###log4j.rootLogger=out,E,I#log4j.logger.com.dear.simpler.dbrpc.util.log.TestUtil=out,Dlog4j.appender.D=com.dear.simpler.dbrpc.util.log.MyLogFileAppenderlog4j.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.ExPatternLayoutlog4j.appender.D.layout.ConversionPattern=[%d{yyyy/MM/ddHH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%nlog4j.appender.E=com.dear.simpler.dbrpc.util.log.MyLogFileAppenderlog4j.appender.E.File=../../logs/db_logs/error/DB_0_%s_error.loglog4j.appender.E.Append=truelog4j.appender.E.MaxFileSize=10MBlog4j.appender.E.MaxBackupIndex=10log4j.appender.E.Threshold=ERRORlog4j.appender.E.layout=com.dear.simpler.dbrpc.util.log.ExPatternLayoutlog4j.appender.E.layout.ConversionPattern=[%d{yyyy/MM/ddHH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%nlog4j.appender.I=com.dear.simpler.dbrpc.util.log.MyLogFileAppenderlog4j.appender.I.File=../../logs/db_logs/info/DB_0_%s_info.loglog4j.appender.I.Append=truelog4j.appender.I.MaxFileSize=10MBlog4j.appender.I.MaxBackupIndex=10log4j.appender.I.Threshold=INFOlog4j.appender.I.layout=com.dear.simpler.dbrpc.util.log.ExPatternLayoutlog4j.appender.I.layout.ConversionPattern=[%d{yyyy/MM/ddHH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%n

输出的日志文件命名如下

自定义log4j日志文件命名规则是什么

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-ddHH\:mm\:ss}|%p|%C|%M|%L|%m%nlog4j.appender.majorMsg.MaxFileSize=1KBlog4j.appender.majorMsg.MaxBackupIndex=10

MyRollingFileAppender.java

packagecom.zws.log;importjava.io.File;importjava.io.IOException;importjava.io.InterruptedIOException;importorg.apache.log4j.Priority;importorg.apache.log4j.RollingFileAppender;importorg.apache.log4j.helpers.CountingQuietWriter;importorg.apache.log4j.helpers.LogLog;importorg.apache.log4j.spi.LoggingEvent;/****@authorwensh.zhu**/publicclassMyRollingFileAppenderextendsRollingFileAppender{privatelongnextRollover=0;publicvoidrollOver(){Filetarget;Filefile;if(qw!=null){longsize=((CountingQuietWriter)qw).getCount();nextRollover=size+maxFileSize;}LogLog.debug("maxBackupIndex="+maxBackupIndex);booleanrenameSucceeded=true;if(maxBackupIndex>0){//删除序号最大(最早的文件)的文件file=newFile(genFileName(fileName,maxBackupIndex));if(file.exists())renameSucceeded=file.delete();//所有文件名序号加1for(inti=maxBackupIndex-1;i>=1&&renameSucceeded;i--){file=newFile(genFileName(fileName,i));if(file.exists()){target=newFile(genFileName(fileName,i+1));renameSucceeded=file.renameTo(target);}}if(renameSucceeded){target=newFile(genFileName(fileName,1));this.closeFile();file=newFile(fileName);renameSucceeded=file.renameTo(target);if(!renameSucceeded){try{this.setFile(fileName,true,bufferedIO,bufferSize);}catch(IOExceptione){if(einstanceofInterruptedIOException){Thread.currentThread().interrupt();}LogLog.error("setFile("+fileName+",true)callfailed.",e);}}}}if(renameSucceeded){try{this.setFile(fileName,false,bufferedIO,bufferSize);nextRollover=0;}catch(IOExceptione){if(einstanceofInterruptedIOException){Thread.currentThread().interrupt();}LogLog.error("setFile("+fileName+",false)callfailed.",e);}}}privateStringgenFileName(Stringname,intindex){StringfileName="";if(index>0){Stringnum=index<10?"0"+index:String.valueOf(index);fileName=name.replace(".log","")+"_"+num+".log";}else{fileName=name;}returnfileName;}protectedvoidsubAppend(LoggingEventevent){super.subAppend(event);if(fileName!=null&&qw!=null){longsize=((CountingQuietWriter)qw).getCount();if(size>=maxFileSize&&size>=nextRollover){rollOver();}}}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:自定义log4j日志文件命名规则是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Python中的getattr,__getattr__,__getattribute__和__get__怎么用下一篇:

8 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18