使用@PluginFactory的log4j2单例自定义appender

时间:2017-01-05 19:17:35

标签: java logging log4j2

我使用log4j2编写了一个自定义Appender。有什么简单的方法可以让它成为单身人士吗?我正在使用@Plugin和@PluginFactory。

实际上这是我遇到的问题(并且看起来好像让单身不是解决方案)。我使用以下代码

创建了一个自定义appender
MyAppender myAppender =  MyAppender.createAppender(MyAppender.MY_APPENDER_NAME);
final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
final Configuration config = loggerContext.getConfiguration();
myAppender.start();
config.addAppender(myAppender);
AppenderRef[] refs = new AppenderRef[] { AppenderRef.createAppenderRef(MyAppender.MY_APPENDER_NAME, null, null) };
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.DEBUG, Logger.getRootLogger().getName(), "true", refs, null, config, null);
loggerConfig.addAppender(myAppender, Level.DEBUG, null);
config.addLogger(Logger.getRootLogger().getName(), loggerConfig);
ctx.updateLoggers();
return myAppender;

我的appender有另一种方法xyz()。当我尝试使用以下代码调用xyz时,它会调用appender的append方法。这是非常令人惊讶的,我没有线索为什么会发生这种情况。

myAppender = (MyAppender) Logger.getRootLogger().getAppender(MyAppender.MY_APPENDER_NAME);
myAppender.xyz()

另外,当我创建另一个appender实例时,不是使用getAppender获取它,它可以正常工作。 :(

1 个答案:

答案 0 :(得分:0)

您可以创建单个实例,将其缓存在静态final字段中,并从@PluginFactory带注释的工厂方法返回该实例。

假设您希望明确阻止用户在修改配置时修改appender的参数,那是否是您将其作为单身人士的动机?

相关问题