相关文章推荐
俊秀的勺子  ·  pandas ...·  1 年前    · 
乖乖的莲藕  ·  HttpContent.ReadAsStri ...·  2 年前    · 

当log4j使用DailyRollingFileAppender进行日志归档时,需要对日志的个数进行控制。

此时需要对DailyRollingFileAppender进行重写。

package org.apache.log4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.text.ParseException;
import java.util.*;
public class MyDailyRollingFileAppender extends DailyRollingFileAppender {
    private static Logger logger = LoggerFactory.getLogger(MyDailyRollingFileAppender.class);
    private int maxFileSize = 60;
    @Override
    void rollOver() throws IOException {
        super.rollOver();
        List<File> fileList = getAllLogs();
        sortFiles(fileList);
        logger.debug(fileList.toString());
        deleteOvermuch(fileList);
     * 删除过多的文件
     * @param fileList 所有日志文件
    private void deleteOvermuch(List<File> fileList) {
        if (fileList.size() > maxFileSize) {
            for (int i = 0;i < fileList.size() - maxFileSize;i++) {
                fileList.get(i).delete();
                logger.debug("删除日志" + fileList.get(i));
     * 根据文件名称上的特定格式的时间排序日志文件
     * @param fileList
    private void sortFiles(List<File> fileList) {
        Collections.sort(fileList, new Comparator<File>() {
            public int compare(File o1, File o2) {
                try {
                    if (getDateStr(o1).isEmpty()) {
                        return 1;
                    Date date1 = sdf.parse(getDateStr(o1));
                    if (getDateStr(o2).isEmpty()) {
                        return -1;
                    Date date2 = sdf.parse(getDateStr(o2));
                    if (date1.getTime() > date2.getTime()) {
                        return 1;
                    } else if (date1.getTime() < date2.getTime()) {
                        return -1;
                } catch (ParseException e) {
                    logger.error("", e);
                return 0;
    private String getDateStr(File file) {
        if (file == null) {
            return "null";
        return file.getName().replaceAll(new File(fileName).getName(), "");
     *  获取所有日志文件,只有文件名符合DatePattern格式的才为日志文件
     * @return
    private List<File> getAllLogs() {
        final File file = new File(fileName);
        File logPath = file.getParentFile();
        if (logPath == null) {
            logPath = new File(".");
        File files[] = logPath.listFiles(new FileFilter() {
            public boolean accept(File pathname) {
                try {
                    if (getDateStr(pathname).isEmpty()) {
                        return true;
                    sdf.parse(getDateStr(pathname));
                    return true;
                } catch (ParseException e) {
                    logger.error("", e);
                    return false;
        return Arrays.asList(files);
    public int getMaxFileSize() {
        return maxFileSize;
    public void setMaxFileSize(int maxFileSize) {
        this.maxFileSize = maxFileSize;

然后在log4j的properties文件中添加

log4j.appender.R=org.apache.log4j.MyDailyRollingFileAppender
log4j.appender.R.MaxFileSize=30
当log4j使用DailyRollingFileAppender进行日志归档时,需要对日志的个数进行控制。此时需要对DailyRollingFileAppender进行重写。package org.apache.log4j;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.FileFilter;import java.io.IOException;imp
每天生成一个log4j日志文件,如果只需要将最近一段时间内的日志文件保留,以前或更早的文件不用保留。例如只保留最近一周的日志日志文件保留3天等等这些。。。通过这个jar包就可以实现。 log4j.properties文件在包中,拷贝出来用就可以了
log4jDailyRollingFileAppender不支持只保留最近n天的数据,时间一久导致日志文件很多,并且一天的文件有可能比较大,所以自己写了个appender,以解决这两个问题。 具体代码实现如下: package com.mytools.common.lo...
最近做项目的时候,遇到了日志的输出问题。我们想按小时输出日志,同时最多保存7天的日志log4j本身自带的appender如下: org.apache.log4j.ConsoleAppender 输出到控制台 org.apache.log4j.FileAppender 输出到文件 org.apache.log4j.DailyRollingFileAppender  org.apache.l...
因为现场的定时调度框架是前辈写的,前辈已高就,现场使用因为涉及到一天几亿数据需要提取出来,转换为其他表数据,所以日志量特别大,1天10个G,长此以往肯定不行的,找了很多网上的教程都不行,最后发现,这样就可以删除3天的日志,目的达到,备忘分享 <?xml version="1.0" encoding="UTF-8"?> <Configuration status="DEBUG"> <Appenders> <Console name="console" tar
日志文件大小1MB,每天最多保留10个文件,只保留7天的日志 rollingRandomAccessFile: # 日志文件Appender,将日志信息输出到日志文件 - name: ROLLING_FILE fileName: ${logPath}/${projectName}.log filePattern: "${logPath}/historyLogs/$${date:yyyy-MM}/${projectName}-%d{yyyy-MM-dd}-%i.log.gz"
  项目中尽管对log4j有基本的配置,例如按天生成日志文件以作区分,但如果系统日志文件过大,则就需要考虑以更小的单位切分或者其他切分方式。下面就总结一下log4j常用的配置参数以及切分日志的不同方式。 一、JAR包准备   压缩包中有三个jar包: log4j-1.2.16.jar tomcat-juli-adapters.jar tomcat-juli.jar   说明:请...
https://www.cnblogs.com/xishuai/p/spring-boot-log4j2.html https://blog.csdn.net/shope9/article/details/87379255 <dependency> <groupId>org.springframew...
一般来说,log4j.jar中提供的日志都是按天保存,并且当天第一次启动项目,去生成前一天的日志,并且Info和error日志信息都保存在一起,对于日志都没有分类,不好管理与查看; 现如今重写 log4j.jar中的DailyRollingFileAppender.java,让日志按照自己约定的方式,满足客户的需求; 重写的类名更改为:CustomDailyRollingFileAppender.java 日志生成要求: 第一种方式: 日志按天生成,按月保存到一个文件夹中,日志...
import java.io.IOException; import java.io.InterruptedIOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Ma