zoukankan      html  css  js  c++  java
  • 扩展log4j系列[一]DailyRollingFileAppender的按分钟生成日志修改为按n分钟生成日志

    复制DailyRollingFileAppender里面的源码,放在新命名的类public class MinuteRollingFileAppender extends FileAppender的里面,修改两个主要地方:

    void rollOver() throws IOException {

        /* Compute filename, but only if datePattern is specified */
        if (datePattern == null) {
          errorHandler.error("Missing DatePattern option in rollOver().");
          return;
        }

        String datedFilename = fileName+sdf.format(now);
        // It is too early to roll over because we are still within the
        // bounds of the current interval. Rollover will occur once the
        // next interval is reached.
        if (scheduledFilename.equals(datedFilename)) {
          return;
        }

        // close current file, and rename it to datedFilename
        this.closeFile();

        //File target  = new File(scheduledFilename);
       

    //modify start------
       
        Calendar rollTime = Calendar.getInstance();
        rollTime.add(Calendar.MINUTE, -1);
       
        log.debug(" ===== log4j rolled file time :" + rollTime.getTime());
       
        String minuteLog =  fileName+sdf.format(rollTime.getTime());
        File target  = new File(minuteLog);
    //modify end------
       
        if (target.exists()) {
          target.delete();
        }

        File file = new File(fileName);
        boolean result = file.renameTo(target);
        if(result) {
          LogLog.debug(fileName +" -> "+ scheduledFilename);
        } else {
          LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
        }

        try {
          // This will also close the file. This is OK since multiple
          // close operations are safe.
          this.setFile(fileName, false, this.bufferedIO, this.bufferSize);
        }
        catch(IOException e) {
          errorHandler.error("setFile("+fileName+", false) call failed.");
        }
        scheduledFilename = datedFilename;
      }

    //下面是按每隔15分钟生成一个日志

    public Date getNextCheckDate(Date now) {
        this.setTime(now);

        switch(type) {
        case MinuteRollingFileAppender.TOP_OF_MINUTE:
     this.set(Calendar.SECOND, 0);
     this.set(Calendar.MILLISECOND, 0);
    //modify start------ 
     this.add(Calendar.MINUTE, 15);
    // modify end------
     break;
        default:
     throw new IllegalStateException("Unknown periodicity type.");
        }
        return getTime();
      }

    //下面是在打印日志的事件里面过滤信息

        protected void subAppend(LoggingEvent event) {
            long n = System.currentTimeMillis();
            if (n >= nextCheck) {
                now.setTime(n);
                nextCheck = rc.getNextCheckMillis(now);
                try {
                    rollOver();
                }
                catch (IOException ioe) {
                    LogLog.error("rollOver() failed.", ioe);
                }
            }
            log.debug(" == MinuteRollingFileAppender test LoggingEvent' message :" + event.getMessage());
            String obj = this.layout.format(event);

            //下面过滤掉空格、空行(注:linux下要加“/r/n”过滤才生效)
            if (obj == null || obj.equals("")||obj.equals(" /r/n") || obj.equals(" /n"))  
                return;
            super.subAppend(event);
        }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    NLP 中的embedding layer
    Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)
    我对REST的理解
    QML 与 C++ 交互之工厂方法
    Hive分析窗体函数之LAG,LEAD,FIRST_VALUE和LAST_VALUE
    【C/C++】:用C实现输出日期的阴历日子
    Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架
    统计报表
    2015 HDU 多校联赛 5363 Key Set
    查看sedna创建的数据库和集合,文档之类
  • 原文地址:https://www.cnblogs.com/cuker919/p/4878636.html
Copyright © 2011-2022 走看看