使用 Log4j 创建 Uber/Fat 个 Jar

Creating Uber/Fat Jars with Log4j

我正在使用 maven 程序集插件创建一个 uber jar。我的程序的依赖项之一是一个应用程序,它可以通过线程在我的程序内部启动,也可以独立启动,因为它是它自己的 uberjar。

我的问题是两个应用程序都使用 log4j2,并且在资源文件夹中都有一个 log4j2.xml。当 Maven 使我的应用程序成为 uberjar 时,它会用依赖项中的配置文件覆盖我的应用程序 log4j.xml 配置文件。有没有办法解决这个问题,同时仍然允许两个应用程序在资源文件夹中拥有配置文件?

当 Log4j 启​​动时,它会按照从高到低的加权顺序定位配置:

  1. Log4j 将检查 "log4j.configurationFile" 系统 属性,如果已设置,将尝试使用与文件扩展名匹配的 ConfigurationFactory 加载配置。
  2. 如果未设置系统 属性,属性 ConfigurationFactory 将在类路径中查找 log4j2-test.properties。
  3. 如果找不到这样的文件,YAML ConfigurationFactory 将在类路径中查找 log4j2-test.yaml 或 log4j2-test.yml。
  4. 如果找不到这样的文件,JSON ConfigurationFactory 将在类路径中查找 log4j2-test.json 或 log4j2-test.jsn。
  5. 如果找不到这样的文件,XML ConfigurationFactory 将在类路径中查找 log4j2-test.xml。
  6. 如果找不到测试文件,ConfigurationFactory 属性将在类路径中查找 log4j2.properties。
  7. 如果找不到属性文件,YAML ConfigurationFactory 将在类路径上查找 log4j2.yaml 或 log4j2.yml。
  8. 如果找不到 YAML 文件,JSON ConfigurationFactory 将在类路径上查找 log4j2.json 或 log4j2.jsn。
  9. 如果无法找到 JSON 文件,XML ConfigurationFactory 将尝试在类路径中找到 log4j2.xml。
  10. 如果找不到配置文件,将使用 DefaultConfiguration。这将导致日志输出到控制台。

因此,最简单的方法是将 log4j.xml 移动到资源目录中的子文件夹,并使用 属性 "log4j.configurationFile" 定义此文件夹。否则只需切换到 属性 基本配置文件 "log4j2.properties"。也许这个 converter 可以帮到你。

另请查看 documentation(这是我从中获得此列表的地方)。