我使用 log4j2 编写了一个自定义 Appender。有什么简单的方法可以使其成为单例吗?我正在使用@Plugin 和@PluginFactory。
实际上,这是我遇到的问题(是的,看起来使其成为单例并不是一个解决方案)。我使用以下代码创建了一个自定义附加程序
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;
我的附加程序有另一个方法 xyz()。当我尝试使用以下代码调用 xyz 时,它改为调用appender 的append 方法。这非常令人惊讶,我不知道为什么会发生这种情况。
myAppender = (MyAppender) Logger.getRootLogger().getAppender(MyAppender.MY_APPENDER_NAME);
myAppender.xyz()
此外,当我创建另一个附加程序实例时,而不是使用 getAppender 获取它,它工作得很好。 :(
最佳答案
您可以创建一个实例,将其缓存在静态最终字段中,然后从带 @PluginFactory 注释的工厂方法返回该实例。
假设您希望在修改配置时明确阻止用户修改您的附加程序的参数,这就是您将其设为单例的动机吗?
关于java - 使用 @PluginFactory 的 log4j2 单例自定义附加程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41492947/