log4j提供了标准的日志输出,简单配置即可记录日志(参考Spring Boot入门:使用AOP实现拦截器 8、日志记录),但使用默认Appender记录日志时,有时并不能满足我们的需求,这时我们可以自定义log4j日志输出格式。
下面我们实现按日期记录日志,日志达到指定大小后重命名保存为新文件。
首先新建GlobalRollingFileAppender继承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;public class GlobalRollingFileAppender extends RollingFileAppender { private long nextRollover = 0L; private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); public void rollOver() { if (qw != null) { long size = ((CountingQuietWriter) qw).getCount(); LogLog.debug("rolling over count=" + size); nextRollover = size + maxFileSize; } LogLog.debug("maxBackupIndex=" + maxBackupIndex); boolean renameSucceeded = true; if (maxBackupIndex > 0) { File file; File target; 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)); LogLog.debug("Renaming file " + file + " to " + target); renameSucceeded = file.renameTo(target); } } if (renameSucceeded) { target = new File(genFileName(fileName, 1)); this.closeFile(); file = new File(fileName); LogLog.debug("Renaming file " + file + " to " + target); 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 = 0L; } 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) { boolean flag = false; String fileNameNow = fileName.substring(fileName.lastIndexOf("/")); String fileNameDate = simpleDateFormat.format(new Date()); if (!fileNameNow.contains(fileNameDate)) { flag = true; int tag = fileNameNow.indexOf("_"); fileName = fileName.replace(fileNameNow.substring(tag + 1, tag + 9), fileNameDate); } if (fileName != null && qw != null) { long size = ((CountingQuietWriter) qw).getCount(); if (flag) { size = 0L; } if ((size >= maxFileSize && size >= nextRollover) || flag) { rollOver(); } } super.subAppend(event); } public void setFile(String file) { fileName = file.trim().replace(".log", "") + "_" + simpleDateFormat.format(new Date()) + ".log"; }}
然后我们将log4j.properties日志输出appender设为GlobalRollingFileAppender ,即log4j.appender.logInfo=cn.wbnull.springbootdemo.boot.GlobalRollingFileAppender
log4j.rootLogger=debug,Console,logInfo,logError,logDebuglog4j.category.org.springframework=debug,Console,logInfo,logError,logDebug##输出到控制台log4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Target=System.outlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C.%M(%F:%L)] || %m%n##输出到文件log4j.appender.logInfo=cn.wbnull.springbootdemo.boot.GlobalRollingFileAppenderlog4j.appender.logInfo.File=./logs/log.loglog4j.appender.logInfo.Append=truelog4j.appender.logInfo.Threshold=INFOlog4j.appender.logInfo.MaxFileSize=2048KBlog4j.appender.logInfo.MaxBackupIndex=1024log4j.appender.logInfo.layout=org.apache.log4j.PatternLayoutlog4j.appender.logInfo.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C.%M(%F:%L)] || %m%n##错误日志单独记录log4j.appender.logError=cn.wbnull.springbootdemo.boot.GlobalRollingFileAppenderlog4j.appender.logError.File=./logs/error.loglog4j.appender.logError.Append=truelog4j.appender.logError.Threshold=ERRORlog4j.appender.logError.MaxFileSize=2048KBlog4j.appender.logError.MaxBackupIndex=1024log4j.appender.logError.layout=org.apache.log4j.PatternLayoutlog4j.appender.logError.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C.%M(%F:%L)] || %m%n##Debug日志单独记录log4j.appender.logDebug=cn.wbnull.springbootdemo.boot.GlobalRollingFileAppenderlog4j.appender.logDebug.File=./logs/debug.loglog4j.appender.logDebug.Append=truelog4j.appender.logDebug.Threshold=DEBUGlog4j.appender.logDebug.MaxFileSize=2048KBlog4j.appender.logDebug.MaxBackupIndex=1024log4j.appender.logDebug.layout=org.apache.log4j.PatternLayoutlog4j.appender.logDebug.filter.infoFilter=org.apache.log4j.varia.LevelRangeFilterlog4j.appender.logDebug.filter.infoFilter.LevelMin=DEBUGlog4j.appender.logDebug.filter.infoFilter.LevelMax=DEBUGlog4j.appender.logDebug.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C.%M(%F:%L)] || %m%n
GitHub:https://github.com/dkbnull/SpringBootDemo
CSDN:https://blog.csdn.net/dkbnull/article/details/84558062
本篇文章来源于微信公众号: 程序员null
微信扫描下方的二维码阅读本文

Comments NOTHING