当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