log4j2修改动态创建log文件名字

本文介绍了如何在Log4j2中实现日志文件名按日期动态生成,以配合现有系统。提供了两种途径:删除fileName属性依赖filePattern,或自定义RollingRandomAccessFileAppender和FileManager。探讨了修改文件名可能带来的问题并给出了解决方案,确保了日志记录的正确性和系统兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

问题:log4j2 创建的文件名字 是固定的,我在 RollingRandomAccessFile 标签的 fileName 属性写什么就一直创建这个文件。
两个途径:
① (推荐)直接删除fileName 属性, log4j2 会直接根据filePattern 生成指定类型log。
②跟了一通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日志打印、滚动切割流程解析

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值