加载自定义类时未应用log4j2配置



我有一个Java应用程序(=launcher(,它通过自定义ClassLoader加载类。在我启动的应用程序和启动器中,我使用带有自定义XML配置的log4j2

在发射器中:

private static final Logger LOGGER;
static
{
loadLog4jConfiguration(ApplicationLauncherClient.class);
LOGGER = getLogger();
}

loadLog4jConfiguration()的实现方式如下:

public static void loadLog4jConfiguration(final Class<?> clazz)
{
try
{
String resourceName = "launcher-log4j2.xml";
try (InputStream inputStream = clazz.getResourceAsStream(resourceName))
{
if (inputStream == null)
{
System.err.println("Cannot find resource: " + resourceName);
} else
{
ConfigurationSource configurationSource = new ConfigurationSource(inputStream);
Configurator.initialize(null, configurationSource);
}
}
} catch (final Exception exception)
{
exception.printStackTrace();
}
}

在启动的应用程序中,我对log4j2进行了相同的设置,但我从类路径加载了一个*不同的*log4j2.xml文件(例如,提供日志消息的JTextArea附件(。

不幸的是,JTextArea日志在自定义类加载时不起作用。然而,当我正常启动应用程序(例如通过IDE(时,它们就可以工作了。我认为log4j2实例之间存在某种冲突。启动器和启动的应用程序具有log4j2maven依赖关系。我该如何干净地解决这个问题?我不想从启动器中完全删除log4j2。我想过可能总是在启动的应用程序上向getLogger()构造函数传递一个类实例,但这也没有帮助。我在启动的应用程序上打印出了LOGGER实例的ClassLoader,在这两种情况下(当自定义类加载时和通过IDE正常启动时(,它都显示sun.misc.Launcher$AppClassLoader,所以现在我不确定还能尝试什么。

尝试使用Configurator.reconfigure(URI)

最新更新