java - 使用 @PluginFactory 的 log4j2 单例自定义附加程序

标签 java logging log4j2

我使用 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/

相关文章:

java logback 自定义记录器名称

logging - 添加到错误消息.NET的有用值

java - log4j2 中的 BasicConfigurator 替换

java - 创建集合的适当字符串表示

java - 警报管理器(无通知)

java - 在应用程序中获取 ServletContext

java - 单击提交后如何用数据填充两个实体

c - 记录每个 C 函数调用的所有参数值

java - log4j2.12.1 中的 PatternConverter 类不包含构造函数

java - Log4j2 看不到配置 xml