我知道在 Log4j2 中,您可以使用以下方法动态设置日志记录目录:
System.setProperty('logDirectory', getLogDirectoryDynamically());
并在 Log4j2 的配置中使用该值:
<File name="File" fileName="${sys:logDirectory:-.}/my.log" append="false">
...
</File>
好吧,但现在假设,无论出于何种原因,您没有一个可以调用
main
的中心位置(例如主类没有 System.setProperty('logDirectory', ...)
方法)。
有没有一种方法可以注册一些(java.util.ServiceLoader)服务,您可以在其中添加此
logDirectory
作为属性,也许可以通过实现 org.apache.logging.log4j.util.PropertySource
接口或类似的东西?
目标是在第一次
LogManager.getLogger(...)
调用时,您的附加属性源将由 java.util.ServiceLoader
加载,其中包含 logDirectory
的值。
PropertySource
服务。
StrLookup
。查找不是通过普通的ServiceLoader
机制来检测的,而是通过Log4j的插件机制来检测的,所以需要用以下方式注释该类:
@Plugin(name = "mylookup", category = StrLookup.CATEGORY)
并使用
log4j-core
中包含的注释处理器进行编译(大多数时候它会被自动检测到)。
完成后,您可以使用:
<File name="File" fileName="${mylookup:logDirectory:-.}/my.log" append="false">
...
</File>
在你的配置文件中。
备注:查找的名称必须全部小写。