需求: 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);
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;
@Override
protected void createFileAfterRollover() throws IOException {
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日志打印、滚动切割流程解析。
|