IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> log4j2修改动态创建log文件名字 -> 正文阅读

[Java知识库]log4j2修改动态创建log文件名字

需求: log 名字需要加上日期,才能接入现有的log 抓取系统, 比如 test.2021-10-18.log 才会被log 系统抓取。

问题:log4j2 创建的文件名字 是固定的,我在 RollingRandomAccessFile 标签的 fileName 属性写什么就一直创建这个文件。
跟了一通log 打印流程后,有个比较粗糙的处理方案:
可以重写 RollingRandomAccessFileAppender 和RollingRandomAccessFileManager#getFileName() 来解决这个问题

代码修改很简单:

新建ExtendRollingRandomAccessFileAppender.java

@Plugin(name = "ExtendRollingRandomAccessFile", category = "Core", elementType = "appender", printObject = true)
public class ExtendRollingRandomAccessFileAppender extends AbstractOutputStreamAppender<RollingFileManager> {
 	@PluginFactory
    public static ExtendRollingRandomAccessFileAppender createAppender(
            @PluginAttribute("fileName") String fileName,
            @PluginAttribute("filePattern") final String filePattern,
            @PluginAttribute("append") final String append,
            @PluginAttribute("name") final String name,
            @PluginAttribute("immediateFlush") final String immediateFlush,
            @PluginAttribute("bufferSize") final String bufferSizeStr,
            @PluginElement("Policy") final TriggeringPolicy policy,
            @PluginElement("Strategy") RolloverStrategy strategy,
            @PluginElement("Layout") Layout<? extends Serializable> layout,
            @PluginElement("Filter") final Filter filter,
            @PluginAttribute("ignoreExceptions") final String ignore,
            @PluginAttribute("advertise") final String advertise,
            @PluginAttribute("advertiseURI") final String advertiseURI,
            @PluginConfiguration final Configuration config,
            @PluginAttribute("namePattern") final String namePattern /*文件后缀格式*/) {

		// 略
       ……

		// 在这里改成自己想要的文件名字
        String newFileName = MyUtil.getNewFileName(fileName, namePattern);

		// 因为newFileName 也波及到了 manager , 所以manager 也需要修改,继续向下看
        final ExtendRollingRandomAccessFileManager manager = ExtendRollingRandomAccessFileManager.getRollingRandomAccessFileManager(
                newFileName, filePattern, isAppend, isFlush, bufferSize, policy, strategy, advertiseURI, layout);
        if (manager == null) {
            return null;
        }

        return new ExtendRollingRandomAccessFileAppender(name, layout, filter, manager,
                newFileName, filePattern, ignoreExceptions, isFlush, bufferSize,
                isAdvertise ? config.getAdvertiser() : null);
    }
}



新建ExtendRollingRandomAccessFileManager.java

public class ExtendRollingRandomAccessFileManager extends RollingFileManager {
	/**
	* 动态文件名字格式
	*/
	private String namePattern = null;
	
	// log切割后,创建新文件的方法
  @Override
    protected void createFileAfterRollover() throws IOException {
   	   // 这里直接拿的 ExtendRollingRandomAccessFileAppender#createAppender() 中刚生成的newFileName,
   	   // 因此这里需要修改成动态生成文件名
        this.randomAccessFile = new RandomAccessFile(getFileName(), "rw");
        if (isAppend()) {
            randomAccessFile.seek(randomAccessFile.length());
        }
        writeHeader();
    }

	/**重写一下*/
     @Override
     public String getFileName() {
          String fileName = super.getFileName();
          String newFileName = MyUtil.getNewFileName(fileName, namePattern);
          return newFileName;
      }
}

log42 配置修改一下标签名字以及自定义属性就完事了。

<ExtendRollingRandomAccessFile name="my-log"
                                 fileName="XXX/my.log"
                                 filePattern="XXX/my.%d{yyyy-MM-dd-HH-mm-ss}.log"
                                 namePattern="yyyy-MM-dd">
                                 ……
</ExtendRollingRandomAccessFile>

但是现在又出现了一个疑问,我改名字对会不会出现写的时候找不到文件的情况?
哈哈哈,因为之前没有看过log打印 的源码。出现这个疑问,是以为log 在切割的时候,修改了文件名字,然后写的时候又去找这个文件,找不到了……
事实上不会的。感兴趣的话可以看一下 log4j2日志打印、滚动切割流程解析

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 11:52:07  更:2021-10-17 11:53:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:10:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码