iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >自定义log4j日志文件命名规则是什么
  • 658
分享到

自定义log4j日志文件命名规则是什么

2023-06-22 06:06:54 658人浏览 泡泡鱼
摘要

小编给大家分享一下自定义log4j日志文件命名规则是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!自定义log4j日志文件命名规则项目中的日志需要采用一致的命

小编给大家分享一下自定义log4j日志文件命名规则是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

自定义log4j日志文件命名规则

项目中的日志需要采用一致的命名规范和文件规范,命名规则为:项目模块标识_index_日期时间_日志级别.log,且每个级别日志文件放在单独的文件夹,且每个文件夹下日志的数量不得超过10个,当数量超过限制时,删除相对较旧的日志,保留较新的日志。

但是发现log4j并不能满足此要求,于是

根据log4j的api定义自己的FileAppender

代码如下:

package com.dear.simpler.dbrpc.util.log; import java.io.File;import java.io.IOException;import java.io.InterruptedIOException;import java.text.SimpleDateFORMat;import java.util.Arrays;import java.util.Comparator;import java.util.Date;import java.util.concurrent.atomic.AtomicInteger;import java.util.regex.Matcher;import java.util.regex.Pattern; import org.apache.log4j.RollingFileAppender;import org.apache.log4j.helpers.CountingQuietWriter;import org.apache.log4j.helpers.LogLog;import org.apache.log4j.spi.LoggingEvent;public class MyLogFileAppender extends RollingFileAppender {          private long nextRollover = 0;      private static AtomicInteger logIndex = new AtomicInteger(0);    //index      public void rollOver() {          File file = null;            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);            if (maxBackupIndex > 0) {              file = new File(getRollingFileName(fileName, logIndex.incrementAndGet()));            if (fileExisted(file)){              file = new File(getRollingFileName(fileName, logIndex.incrementAndGet()));              }            deleteOldFile(file.getParentFile(), maxBackupIndex);            this.closeFile();        }         try {              this.setFile(getRollingFileName(fileName, logIndex.get()), false, bufferedIO, bufferSize);              nextRollover = 0;          } catch (IOException e) {              if (e instanceof InterruptedIOException) {              Thread.currentThread().interrupt();          }            LogLog.error("setFile(" + fileName + ", false) call failed.", e);          }    }        private String getRollingFileName(String fileName, int index) {     //使用正则表达式替代index        Pattern p = Pattern.compile("_\\d+\\_");              Matcher m=p.matcher(fileName);        String str = m.replaceFirst(String.format("_%d_", index));        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");   //日期          String dateString = format.format(new Date(System.currentTimeMillis()));        str = str.replaceAll("\\d{14}", dateString);        return str;      }    public synchronized void setFile(String fileName, boolean append,   //修改文件名            boolean bufferedIO, int bufferSize) throws IOException {     SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");   //日期          String dateString = format.format(new Date(System.currentTimeMillis()));          String temp = String.format(fileName , dateString);   //文件名        super.setFile(temp, append, bufferedIO, bufferSize);                  if(append) {            File f = new File(temp);            ((CountingQuietWriter)this.qw).setCount(f.length());        }    }        private boolean fileExisted(File file){    boolean res = false;    String[] fts = file.getName().split("_");    File parentFile = file.getParentFile();    for(File f : parentFile.listFiles()){    String[] fns = f.getName().split("_");    if(fns[0].equals(fts[0]) && fns[1].equals(fts[1])){    res = true;    break;    }    }    return res;    }      private void deleteOldFile(File dir , int maxInt){    if(getFileNum(dir) >= maxBackupIndex ){        File[] files = orderByDate(dir);        for (int i = 0; i <= files.length - maxBackupIndex; i++) {File f = files[i];f.delete();}    }    }        private int getFileNum(File file){        return file.list().length;    }        //将文件按日期排序      public File[] orderByDate(File dir) {         File[] fs = dir.listFiles();         Arrays.sort(fs,new Comparator< File>(){       @Override       public int compare(File f1, File f2) {         long diff = f1.lastModified() - f2.lastModified();         if (diff > 0)         return 1;         else if (diff == 0)         return 0;         else         return -1;         }       @Override       public boolean equals(Object obj) {         return true;         }           });       return fs;      }          @Override    protected void subAppend(LoggingEvent event) {        super.subAppend(event);          if (fileName != null && qw != null) {              long size = ((CountingQuietWriter) qw).getCount();              if (size >= maxFileSize && size >= nextRollover) {                  rollOver();              }          }      }    }

对应的log4j.properties的配置文件如下

### set log levels ###  log4j.rootLogger = out,E,I  #log4j.logger.com.dear.simpler.dbrpc.util.log.TestUtil=out,Dlog4j.appender.D = com.dear.simpler.dbrpc.util.log.MyLogFileAppender  log4j.appender.D.File = ../../logs/db_logs/debug/DB_0_%s_debug.loglog4j.appender.D.Append = truelog4j.appender.D.MaxFileSize=1024MBlog4j.appender.D.MaxBackupIndex=10log4j.appender.D.Threshold = DEBUG   log4j.appender.D.layout = com.dear.simpler.dbrpc.util.log.ExPatternLayout log4j.appender.D.layout.ConversionPattern = [%d{yyyy/MM/dd HH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%nlog4j.appender.E = com.dear.simpler.dbrpc.util.log.MyLogFileAppender  log4j.appender.E.File = ../../logs/db_logs/error/DB_0_%s_error.log    log4j.appender.E.Append = truelog4j.appender.E.MaxFileSize=10MBlog4j.appender.E.MaxBackupIndex=10log4j.appender.E.Threshold = ERROR   log4j.appender.E.layout = com.dear.simpler.dbrpc.util.log.ExPatternLayout  log4j.appender.E.layout.ConversionPattern = [%d{yyyy/MM/dd HH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%n log4j.appender.I = com.dear.simpler.dbrpc.util.log.MyLogFileAppender  log4j.appender.I.File = ../../logs/db_logs/info/DB_0_%s_info.log log4j.appender.I.Append = true  log4j.appender.I.MaxFileSize=10MBlog4j.appender.I.MaxBackupIndex=10log4j.appender.I.Threshold = INFO   log4j.appender.I.layout = com.dear.simpler.dbrpc.util.log.ExPatternLayout log4j.appender.I.layout.ConversionPattern = [%d{yyyy/MM/dd HH:mm:ss,SSS}][%T:%t][%p][%F:%L:%M][%m]%n

输出的日志文件命名如下

自定义log4j日志文件命名规则是什么

log4j自定义生成文件的名称

我们在使用Log4j的RollingFileAppender循环生成文件的时候,生成的文件的名称有点儿恶心,例如,文件名称为app.log,那么生成的文件名依次为app.log.1,app.log.2,....

那么如何去改变生成文件的名称的规则呢?下面是一个简单示例:

log4j.properties

log4j.logger.major= INFO, majorMsglog4j.additivity.logError = falselog4j.appender.majorMsg=com.zws.log.MyRollingFileAppenderlog4j.appender.majorMsg.File=${catalina.home}/logs/itc/majorMsg.loglog4j.appender.majorMsg.layout=org.apache.log4j.PatternLayoutlog4j.appender.majorMsg.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}|%p|%C|%M|%L|%m%nlog4j.appender.majorMsg.MaxFileSize=1KBlog4j.appender.majorMsg.MaxBackupIndex=10

MyRollingFileAppender.java

package com.zws.log;import java.io.File;import java.io.IOException;import java.io.InterruptedIOException;import org.apache.log4j.Priority;import org.apache.log4j.RollingFileAppender;import org.apache.log4j.helpers.CountingQuietWriter;import org.apache.log4j.helpers.LogLog;import org.apache.log4j.spi.LoggingEvent;public class MyRollingFileAppender extends RollingFileAppender { private long nextRollover = 0; public void rollOver() {  File target;  File file;  if (qw != null) {   long size = ((CountingQuietWriter) qw).getCount();   nextRollover = size + maxFileSize;  }  LogLog.debug("maxBackupIndex=" + maxBackupIndex);  boolean renameSucceeded = true;  if (maxBackupIndex > 0) {   //删除序号最大(最早的文件)的文件   file = new File(genFileName(fileName, maxBackupIndex));   if (file.exists())    renameSucceeded = file.delete();   //所有文件名序号加1   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));     renameSucceeded = file.renameTo(target);    }   }   if (renameSucceeded) {    target = new File(genFileName(fileName, 1));    this.closeFile();     file = new File(fileName);    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 = 0;   } 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) {  super.subAppend(event);  if (fileName != null && qw != null) {   long size = ((CountingQuietWriter) qw).getCount();   if (size >= maxFileSize && size >= nextRollover) {    rollOver();   }  } }}

以上是“自定义log4j日志文件命名规则是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 自定义log4j日志文件命名规则是什么

本文链接: https://www.lsjlt.com/news/302868.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 自定义log4j日志文件命名规则是什么
    小编给大家分享一下自定义log4j日志文件命名规则是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!自定义log4j日志文件命名规则项目中的日志需要采用一致的命...
    99+
    2023-06-22
  • 自定义log4j日志文件命名规则说明
    目录自定义log4j日志文件命名规则根据log4j的API定义自己的FileAppender对应的log4j.properties的配置文件如下输出的日志文件命名如下log4j自定义...
    99+
    2024-04-02
  • java源文件的命名规则是什么
    Java源文件的命名规则如下:1. 文件名必须与公共类的类名相同。2. 文件名应以大写字母开头,并以.java为扩展名。3. 文件名...
    99+
    2023-10-20
    java
  • Navicat怎么自定义备份文件的存储位置和命名规则
    要自定义Navicat备份文件的存储位置和命名规则,可以按照以下步骤操作: 打开Navicat软件并连接到数据库服务器。 在Nav...
    99+
    2024-05-11
    Navicat
  • c语言用户名定义规则是什么
    在C语言中,用户名的定义规则是:1. 用户名只能由字母、数字和下划线组成。2. 用户名必须以字母或下划线开头,不能以数字开头。3. ...
    99+
    2023-08-16
    c语言
  • oracle列名命名规则是什么
    在Oracle数据库中,列名的命名规则如下: 列名必须以字母开头,可以包含字母、数字和下划线。 列名的长度不能超过30个字符。 列...
    99+
    2024-04-09
    oracle
  • java方法名命名规则是什么
    Java 方法名的命名规则通常遵循以下几点: 方法名必须以字母开头,后面可以跟着字母、数字或下划线。 方法名不能使用关键字或保留字...
    99+
    2024-04-02
  • java项目名命名规则是什么
    在Java中,项目名通常遵循以下命名规则: 使用有意义的名称:项目名应该能够清楚地表达项目的目的和内容。 使用驼峰命名法:项...
    99+
    2024-04-02
  • dubbo项目命名规则是什么
    在Dubbo项目中,通常会遵循以下命名规则: 包名:包名通常采用反向域名命名规则,如com.example.service。 类名...
    99+
    2024-04-02
  • java变量命名规则是什么
    Java变量命名规则如下:1. 只能以字母、下划线或美元符号开头。2. 后续字符可以是字母、数字、下划线或美元符号。3. 大小写敏感...
    99+
    2023-10-09
    java
  • java驼峰命名规则是什么
    Java驼峰命名规则是一种命名规范,用于命名Java中的变量、方法和类。它的主要特点是:1. 首字母小写,后续的每个单词首字母大写,例如:myVariableName。2. 类名的首字母大写,后续的每个单词首字母大写,例如:MyClas...
    99+
    2023-08-09
    java
  • mongodb建表命名规则是什么
    MongoDB的建表命名规则没有强制的规定,但是有一些常见的命名规范可以参考。以下是一些常见的命名规则:1. 使用小写字母:Mong...
    99+
    2023-08-24
    mongodb
  • JavaScript变量定义规则是什么
    JavaScript变量的定义规则如下:1. 变量名必须以字母、下划线(_)或美元符号($)开头。2. 变量名可以包含字母、数字、下...
    99+
    2023-10-12
    JavaScript
  • log4j配置按日期生成日志文件的方法是什么
    要按日期生成日志文件,可以使用log4j的DailyRollingFileAppender。它可以根据日期规则来生成新的日志文件。以...
    99+
    2023-09-13
    log4j
  • Android apk文件打包自定义命名
    前言 在Android Studio中打包生成的APK和aar文件基本上都是module名称+构建类型,常见的都是app-debug.apk和app-release.apk这种样式的。 显然没有版本号...
    99+
    2023-09-01
    android android studio
  • logback怎么自定义指定日志文件存储目录
    这篇文章主要介绍“logback怎么自定义指定日志文件存储目录”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“logback怎么自定义指定日志文件存储目录”文章能帮助大家解决问题。logback自定义...
    99+
    2023-07-05
  • log4j定时删除旧日志的方法是什么
    在log4j中,可以使用`org.apache.log4j.rolling.RollingFileAppender`来实现定时删除旧...
    99+
    2023-09-16
    log4j
  • python列表命名的规则是什么
    Python列表命名的规则与其他变量命名的规则相同。以下是一些常见的规则: 变量名必须以字母或下划线开头。 变量名只能包含字母、数...
    99+
    2023-10-23
    python
  • PHP 函数的命名规则是什么?
    php 函数命名规则明确如下:采用小写字母和下划线分隔单词;私有函数以双下划线开头;反映函数功能,避免通用或模糊的名称;使用动词-名词格式,如:print_message()。 PHP...
    99+
    2024-04-10
    php 命名规则
  • python函数的命名规则是什么
    python中函数的命名规则有以下几点函数名一律小写,如有多个单词,用下划线隔开。类内部函数命名,用单下划线(_)开头。类内私有函数命名,用双下划线(__)开头。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作