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

需求: 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日志打印、滚动切割流程解析。

你可能感兴趣的:(Java,log4j2,java,log4j2,动态生成文件名)