`
cao_jian
  • 浏览: 7987 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

log4j每天生成一个日期目录,目录下生成指定大小,指定文件个数的日志文件

阅读更多
在系统运行中log4j产生的日志文件都在一个目录里,查看日志的时候有很多的文件很不直观,如果log4j每天都生成一个以日期为目录名的目录,然后把当天的日志放到该目录里。查询日志的时候如果要查哪天的日志就到哪天的日期目录下查询非常直观方便,如下就是重写org.apache.log4j.RollingFileAppender的类

package com.mttang.js.auth.util;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;

//继承log4j的RollingFileAppender类
public class MttangLog4jRollingFileAppender extends RollingFileAppender {
 
   private long nextRollover = 0;
   private static Map<String, BeginFileData> fileMaps = new HashMap<String, BeginFileData>();
   private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   // synchronization not necessary since doAppend is alreasy synched 
   public void rollOver() {
  
     File target;
     File file;
     int maxBackupIndexLeng = String.valueOf(maxBackupIndex).length();
     if (qw != null) {
         long size = ((CountingQuietWriter) qw).getCount();
         LogLog.debug("rolling over count=" + size);
         //   if operation fails, do not roll again until
         //      maxFileSize more bytes are written
         nextRollover = size + maxFileSize;
     }
     LogLog.debug("maxBackupIndex="+maxBackupIndex);
    
     String nowDateString = sdf.format(new Date());
     String newFileName = (fileName.indexOf(".") != -1 ? fileName.substring(0, fileName.lastIndexOf(".")) : fileName);
  
     boolean renameSucceeded = true;
     // If maxBackups <= 0, then there is no file renaming to be done.
     if(maxBackupIndex > 0) {
      
       // Delete the oldest file, to keep Windows happy.
       file = new File(newFileName +'.'+nowDateString+'.' +getIndex(maxBackupIndex,maxBackupIndexLeng));
      
       if (file.exists()){
        renameSucceeded = file.delete();
       }
       // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
       for (int i = maxBackupIndex - 1; (i >= 1 && renameSucceeded); i--) 
       {  
    file = new File(newFileName +'.'+nowDateString+'.' + getIndex(i,maxBackupIndexLeng));
    if(file.exists()) 
    {
      target = new File(newFileName +'.'+nowDateString+'.' +getIndex(i+1,maxBackupIndexLeng));
      LogLog.debug("Renaming file " + file + " to " + target);
      renameSucceeded = file.renameTo(target);
    }
       }
      
     if(renameSucceeded) {
       BeginFileData beginFileData = fileMaps.get(fileName);
       System.out.println("fileName= "+fileName+"\t beginFileData="+beginFileData);
       //在每天一个日志目录的方式下,检测日期是否变更了,如果变更了就要把变更后的日志文件拷贝到变更后的日期目录下。
       if(newFileName.indexOf(nowDateString) == -1 && beginFileData.getFileName().indexOf("yyyy-MM-dd") != -1){
       newFileName = beginFileData.getFileName().replace("yyyy-MM-dd", nowDateString);
       newFileName = (newFileName.indexOf(".") != -1 ? newFileName.substring(0, newFileName.lastIndexOf(".")) : newFileName);
       }
       target = new File(newFileName +'.'+nowDateString+'.' + getIndex(1,maxBackupIndexLeng));
       this.closeFile(); 
       file = new File(fileName);
       LogLog.debug("Renaming file " + file + " to " + target);
      
       renameSucceeded = file.renameTo(target);
       //
       //   if file rename failed, reopen file with append = true
       //
       if (!renameSucceeded) {
           try {
             this.setFile(fileName, true, bufferedIO, bufferSize);
           }
           catch(IOException e) {
             LogLog.error("setFile("+fileName+", true) call failed.", e);
           }
       }
     }
     }
     //
     //   if all renames were successful, then
     //
     if (renameSucceeded) {
      
     try {
       // This will also close the file. This is OK since multiple
       // close operations are safe.
  
       this.setFile(fileName, false, bufferedIO, bufferSize);
       nextRollover = 0;
     }
     catch(IOException e) {
       LogLog.error("setFile("+fileName+", false) call failed.", e);
     }
     }
   }




   /**
    * 文件个数的长度补零,如果文件个数为10那么文件的个数长度就是2位,第一个文件就是01,02,03....
    * @param i
    * @param maxBackupIndexLeng
    * @return
    */
   private String getIndex(int i,int maxBackupIndexLeng){
    String index = String.valueOf(i);
    int len = index.length();
    for(int j = len; j<maxBackupIndexLeng;j++){
     index ="0"+index;
    }
    return index+".log";
   }
 



   /**
      This method differentiates RollingFileAppender from its super
      class.
      @since 0.9.0
   */
   protected
   void subAppend(LoggingEvent event) {
     super.subAppend(event);
     if(fileName != null && qw != null) {
      
       String nowDate = sdf.format(new Date());
    //检测日期是否已经变更了,如果变更了就要重创建日期目录
    if(!fileMaps.get(fileName).getDate().equals(nowDate)){
     rollOver();
     return;
    }
      
         long size = ((CountingQuietWriter) qw).getCount();
         if (size >= maxFileSize && size >= nextRollover) {
             rollOver();
         }
     }
    }
   
 

 
 @Override
 public synchronized void setFile(String fileName, boolean append,
   boolean bufferedIO, int bufferSize) throws IOException {
  
   String nowDate = sdf.format(new Date());
   //如果文件路径包含了“yyyy-MM-dd”就是每天一个日志目录的方式记录日志(第一次的时候)
   if(fileName.indexOf("yyyy-MM-dd") != -1){
    String beginFileName = fileName;
    fileName = fileName.replace("yyyy-MM-dd", nowDate);
    fileMaps.put(fileName, new BeginFileData(beginFileName,nowDate));
   }
   BeginFileData beginFileData = fileMaps.get(fileName);
   //检测日期是否已经变更了,如果变更了就要把原始的字符串给fileName变量,把变更后的日期做为开始日期
   if(!beginFileData.getDate().equals(nowDate)){
    //获取出第一次的文件名
    beginFileData.setDate(nowDate);
    fileName = beginFileData.getFileName().replace("yyyy-MM-dd", nowDate);
    fileMaps.put(fileName, beginFileData);
   }
   
   //D:/data/test/yyyy-MM-dd/test.log 替换yyyy-MM-dd为当前日期。
  
   super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
 }
 



 class BeginFileData{
  
  public BeginFileData(String fileName, String date) {
   super();
   this.fileName = fileName;
   this.date = date;
  }
  private String fileName;
  private String date;
  public String getFileName() {
   return fileName;
  }
  public void setFileName(String fileName) {
   this.fileName = fileName;
  }
  public String getDate() {
   return date;
  }
  public void setDate(String date) {
   this.date = date;
  }
 }
}




log4j配置文件
<appender class="com.mttang.log4j.MyRollingFileAppender">
<param value="D:/data/test/yyyy-MM-dd/test.log"/>
<param value="true"/>
<param value="50KB"/><!-每个文件50KB->
<param value="10"/><!-每天的日期目录下10个日志文件->

<layout class="org.apache.log4j.PatternLayout">
  <param value="%c %d{ISO8601}-- %p -- %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param value="INFO" />
  <param value="INFO" />
  <param value="         http://wwww.baoshengdianzi.com          " />

</filter>
</appender>
金属膜电阻供应商 http://wwww.baoshengdianzi.com
分享到:
评论

相关推荐

    log4j 写多个日志文件,按照日期每天都记

    2. **使用DailyRollingFileAppender**:`DailyRollingFileAppender`是`log4j`提供的一种特殊Appender,它可以按照指定的时间间隔(通常是每天)滚动生成新的日志文件。我们可以通过以下配置设置每日滚动: ```...

    tomcat下用Log4j 按文件大小,生成catalina.out日志文件

    在这个配置中,`MaxFileSize`参数指定了单个日志文件的最大大小(5MB),一旦达到这个大小,Log4j会滚动日志并创建新的文件。`MaxBackupIndex`参数指定了最多保留的旧日志文件数量,这里设置为10,意味着系统会保留...

    Tomcat下使用Log4j接管生成日志文件

    创建一个名为`log4j.properties`或`log4j.xml`的配置文件,放置在Web应用的`WEB-INF/classes`目录下。例如,`log4j.properties`配置如下: ```properties # 设置全局日志级别为INFO log4j.rootLogger=INFO, FILE #...

    log4j生成带时间戳的日志文件(包括extras包以及简单demo)

    总结来说,Log4j是一个强大的日志框架,通过使用extras包和适当的配置,我们可以方便地生成带有时间戳的日志文件,进行日志级别的控制,以及有效地管理日志文件的大小。在实际项目中,熟练掌握Log4j的使用对于提高...

    log4j日志文件

    - Commons-Logging:提供了一个统一的日志接口,可以根据环境自动选择合适的日志实现(如Log4j、JDK内置日志等)。在程序中使用`Log`和`LogFactory`,无需直接引用Log4j的类。 在实际应用中,根据项目需求,可以...

    log4j日志详细讲解

    首先,要在项目中启用Log4j,需要创建一个名为`log4j.properties`的配置文件,将其放在`classes`目录下。这个文件用于定义Log4j的行为,包括日志的级别、输出目的地、格式等。 1. **配置根Logger** 根Logger是Log4...

    log4j 配置日志文件,把日志信息输出到项目的某个文件夹下

    log4j.appender.FILE.DatePattern='.'yyyy-MM-dd'.log' # 每天生成一个新的日志文件 # 设置日志格式 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%d...

    log4j生成文件及文件夹

    在这个配置中,`DatePattern`参数指定了日期格式,`'.'yyyy-MM-dd`表示每天一个新的日志文件,文件名为`app.log.yyyy-MM-dd`。这样,每天都会自动创建一个新的日志文件。 **动态生成文件夹:** Log4j默认会在指定的...

    log4j2+slf4j+测试类日志按日期生成

    当运行这个测试类,它将按照`log4j2.xml`配置生成日志文件,每24小时创建一个新的日志文件,便于管理和查询历史日志。 总结来说,`Log4j2`和`SLF4J`的组合使用,不仅简化了日志记录的代码,还提供了强大的日志管理...

    log4cpp(添加按日期生成日志类)

    "Log4cpp(添加按日期生成日志类)" 提示我们这是一个关于Log4cpp的项目,而且已经进行了扩展,增加了按照日期生成日志文件的功能。Log4cpp是C++的一个日志记录库,它借鉴了Java中的log4j框架,提供了灵活的日志管理...

    log4j(二):动态配置日志输出路径

    上述配置中,`log4j.appender.FILE.File`指定了日志文件的路径,`${user.home}/logs/myapp.log`表示日志将被写入用户主目录下的logs文件夹中的myapp.log文件。通过改变这个路径,我们就能动态地改变日志输出的位置。...

    weblogic中使用log4j生成日志文件实例

    本文将通过一个具体的实例,详细解释如何在WebLogic环境中集成并使用Log4j生成日志文件。 首先,我们需要理解Log4j的基本组件。Log4j主要由三个部分组成:配置器(Configuration)、日志器(Logger)和布局器...

    log4net 配置 根据日期生成 文件 根据 分类 (INFO、ERROR) 生成文件

    1. **根据日期生成文件**:每个日期生成一个独立的日志文件。 2. **按日志级别(INFO、ERROR)分别记录**:INFO级别的日志记录在一个文件中,ERROR级别的日志记录在另一个文件中。 #### 三、具体配置分析 ##### 1. ...

    Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式

    这个配置将日志级别设置为DEBUG,日志输出到`app.log`文件,并且每天生成一个新的日志文件。 3. **覆盖Tomcat的默认配置**:在Tomcat的`conf`目录下创建一个名为`logging.properties`的文件,内容如下: ``` ...

    log4j自定义日志文件名及日志输出格式

    默认情况下,Log4j的日志文件名通常是固定的或者基于时间戳生成的。然而,我们可以创建一个自定义的`org.apache.log4j.FileAppender`子类来覆盖默认行为。这个子类可以重写`setFile()`方法,根据业务逻辑来决定...

    log4j删除前N天日志

    首先,DailyRollingFileAppender是Log4j中的一个Appender实现,它按照日期滚动日志文件。例如,每天生成一个新的日志文件,这样可以避免单个日志文件过大。这个特性对于长时间运行的应用尤其有用,因为它能够保持...

    log4j按照不同appender生成日志例子

    本示例将深入讲解如何利用Log4j的不同Appender来生成不同的日志文件,以满足不同接口或模块的日志记录需求。 首先,我们需要理解什么是Appender。在Log4j中,Appender是负责将日志信息输出到特定目的地的组件,如...

    mybatis,log4j打印日志到后台和文件

    创建一个名为 `log4j.properties` 或 `log4j.xml` 的配置文件,放在项目的类路径下。以下是一个基本的 `log4j.properties` 示例,用于设置日志级别、输出目的地及格式: ``` log4j.rootLogger=DEBUG, Console, ...

    log4j按功能保存日志

    - 通过配置`RollingFileAppender`,可以实现日志文件的大小限制或日期滚动,例如每天生成一个新的日志文件。 - 归档策略可以通过`Policies`子元素来设定,如基于日期的`TimeBasedTriggeringPolicy`或基于文件大小...

    log4j多文件输出打印

    在"Log4j多文件输出打印"的场景下,我们通常会配置多个Appender,每个Appender对应一个不同的输出文件。这样,不同的日志信息可以被分别写入不同的文件,便于管理和分析。例如,在`log4j.properties`配置文件中,...

Global site tag (gtag.js) - Google Analytics