Spring Boot自定义log4j日志输出

GitHub:SpringBootDemo

Gitee:SpringBootDemo

微信公众号:

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,logDebug
log4j.category.org.springframework=debug,Console,logInfo,logError,logDebug
#
#输出到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.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.GlobalRollingFileAppender
log4j.appender.logInfo.File=./logs/log.log
log4j.appender.logInfo.Append=true
log4j.appender.logInfo.Threshold=INFO
log4j.appender.logInfo.MaxFileSize=2048KB
log4j.appender.logInfo.MaxBackupIndex=1024
log4j.appender.logInfo.layout=org.apache.log4j.PatternLayout
log4j.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.GlobalRollingFileAppender
log4j.appender.logError.File=./logs/error.log
log4j.appender.logError.Append=true
log4j.appender.logError.Threshold=ERROR
log4j.appender.logError.MaxFileSize=2048KB
log4j.appender.logError.MaxBackupIndex=1024
log4j.appender.logError.layout=org.apache.log4j.PatternLayout
log4j.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.GlobalRollingFileAppender
log4j.appender.logDebug.File=./logs/debug.log
log4j.appender.logDebug.Append=true
log4j.appender.logDebug.Threshold=DEBUG
log4j.appender.logDebug.MaxFileSize=2048KB
log4j.appender.logDebug.MaxBackupIndex=1024
log4j.appender.logDebug.layout=org.apache.log4j.PatternLayout
log4j.appender.logDebug.filter.infoFilter=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.logDebug.filter.infoFilter.LevelMin=DEBUG
log4j.appender.logDebug.filter.infoFilter.LevelMax=DEBUG
log4j.appender.logDebug.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%C.%M(%F\:%L)] || %m%n

微信:Spring Boot入门:自定义log4j日志输出

微博:Sina Visitor System

知乎:Spring Boot自定义log4j日志输出 - 知乎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值