如何在log4j2的RollingFileAppender文件名中使用Configuration名称?
如何在Log4j2的RollingFileAppender中使用Configuration的name属性
我明白你的需求——想把Log4j2配置里<Configuration>标签的name值直接用到RollingFileAppender的文件名里,但试了几种变量都没生效对吧?这是因为默认情况下,Configuration的name并没有暴露在Log4j2的内置Lookup体系中,不过我们有两种靠谱的解决方案:
方案一:自定义Lookup(最灵活的方式)
Log4j2支持自定义Lookup扩展,我们可以写一个简单的Lookup类来获取Configuration的名称:
1. 实现自定义Lookup类
创建一个实现StrLookup接口的类,通过LogEvent获取当前的Configuration并返回它的name:
import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.lookup.StrLookup; import org.apache.logging.log4j.core.plugins.Plugin; import org.apache.logging.log4j.core.plugins.PluginName; // 用@Plugin注解标记为Log4j2插件,方便自动识别 @Plugin(name = "config", category = StrLookup.CATEGORY) public class ConfigurationNameLookup implements StrLookup { @Override public String lookup(String key) { // 无LogEvent场景下的 fallback,这里可以根据需要调整 return null; } @Override public String lookup(LogEvent event, String key) { // 从当前日志事件中获取Configuration,返回其name属性 Configuration config = event.getConfiguration(); return config.getName(); } }
2. 注册自定义Lookup
确保你的Lookup类所在的包被Log4j2扫描到,在<Configuration>标签的packages属性里加上你的类所在包:
<Configuration status="debug" strict="true" name="MyApplication1" packages="your.package.path,org.apache.logging.log4j.test">
3. 在文件名中使用
现在就可以用${config:}(因为我们的Plugin name是config,这里key可以忽略,直接返回name)来引用Configuration的名称了:
<RollingFile name="File" fileName="/user/home/abc/${config}.log"> <!-- 其他配置 --> </RollingFile>
方案二:提前注入系统属性(适合固定名称场景)
如果你的Configuration name是固定不变的,也可以在应用启动时把这个值注入为系统属性,比如在JVM启动参数里加上:
-Dlog4j.config.name=MyApplication1
然后在Log4j2配置里直接引用这个系统属性:
<RollingFile name="File" fileName="/user/home/abc/${sys:log4j.config.name}.log"> <!-- 其他配置 --> </RollingFile>
注意这种方式需要保证系统属性值和<Configuration>标签的name属性一致,否则会出现不一致的情况。
为什么你之前的尝试没生效?
简单解释下:
${ctx:name}:这是用来获取MDC(映射诊断上下文)中的变量,和Configuration的name无关${name}:Log4j2没有内置这个Lookup键,无法识别${log4j:name}:同样不是Log4j2内置的Lookup键,没有对应的处理逻辑
内容的提问来源于stack exchange,提问作者Igor Deruga
相关产品推荐
相关产品推荐

