问题:log4j2 创建的文件名字 是固定的,我在 RollingRandomAccessFile 标签的 fileName 属性写什么就一直创建这个文件。
两个途径:
① (推荐)直接删除fileName 属性, log4j2 会直接根据filePattern 生成指定类型log。
②跟了一通log 打印流程后,有个比较粗糙的处理方案:
可以重写 RollingRandomAccessFileAppender 和RollingRandomAccessFileManager#getFileName() 来解决这个问题
@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);
}
}
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日志打印、滚动切割流程解析。