【问题标题】:How to specify a logback configuration as a classpath resource rather than a file如何将 logback 配置指定为类路径资源而不是文件
【发布时间】:2019-12-19 02:05:10
【问题描述】:

我有以下情况。我需要能够运行由不同批处理文件启动的两个程序,其中每个批处理文件都使用同一个 jar 中的 main() 调用一个 java 类。我希望每个程序都有自己的日志。但是,第二个程序是第一个程序的安装程序,因此,我不想/不能轻易指定 -Dlogback.configurationFile=/path/to/config 文件,因为该位置可能尚不存在。

Logback documentation seems to provide a solution 但我需要一个如何使其工作的示例:

将默认配置文件的位置指定为系统 属性

如果你愿意,你可以指定默认配置的位置 具有名为 logback.configurationFile 的系统属性的文件。价值 该属性的属性可以是 URL、类路径上的资源或路径 到应用程序外部的文件。

java -Dlogback.configurationFile=/path/to/config.xml Chapters.configuration.MyApp1

谁能指出一个示例,其中 logback.configurationFile 被定义为类路径上的资源而不是文件系统?

【问题讨论】:

  • 如果您只是希望更改日志文件,为什么不在单个 logback.xml 配置文件中将日志文件定义为变量。如果大多数日志记录配置是相同的,这将特别好。然后可以从类路径中的资源中读取日志文件名称,或者作为安装程序调用的一部分。

标签: logback


【解决方案1】:

您可以简单地将my-logback.xml 放在您的一个类路径条目的根目录中并指定-Dlogback.configurationFile=my-logback.xml。在内部,它可能会使用 ClassLoader#getResource(String name) 来获取文件 - 请查看此方法的 JavaDoc 以获取更多信息。

【讨论】:

  • 我想这会起作用,但出于好奇,对于类路径根目录下的位置,您将如何做到这一点?
  • 我现在真的试过了,它确实有效。你能再检查一下你的设置吗?
  • 您必须省略前导 / 才能从类路径中提取。如果 logback.xml 在你的 jar 的 /etc 目录中,logback.configurationFile = etc/logback.xml
【解决方案2】:

这个问题的答案在提供的链接中: https://logback.qos.ch/manual/configuration.html#configFileProperty 用下面的例子:

要包含的内容可以作为文件、资源或 URL 引用。

As a file:
To include a file use the file attribute. You can use relative paths but note that the current directory is defined by the application and is not necessarily related to the path of the configuration file.

As a resource:
To include a resource, i.e a file found on the class path, use the resource attribute.

<include resource="includedConfig.xml"/>

As a URL:
To include the contents of a URL use the url attribute.

<include url="http://some.host.com/includedConfig.xml"/>

【讨论】:

    【解决方案3】:

    我有一个稍微不同于提供命令行参数的解决方案。

    我的项目是这样设置的:

    | foo
      - src
        - conf
          - logback.xml
        - main
        - test
    

    我想将logback.xml 放在罐子外面,因为我将scanPeriod 设置为实时重新加载。我想既然它应该在类路径中被拾取,我会将路径添加到manifest.mf,它会自动被拾取。


    foopom.xml 的相关部分如下所示:

    <plugins>
      . . . Some plugins before
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/target/conf</outputDirectory>
              <resources>
                <resource>
                  <directory>src/conf</directory>
                </resource>
              </resources>
            </configuration>
          </execution>
        </executions>
      </plugin>
    
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
              <mainClass>com.company.foo.main.Main</mainClass>
            </manifest>
            <manifestEntries>
              <version>${project.version}</version>
              <Class-Path>.</Class-Path>
              <Class-Path>conf/</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      . . . Some plugins after
    </plugins>
    

    需要注意的重要事项:

    • Maven 资源插件
      • src/conf 中的所有文件复制到标准编译文件夹target/conf
    • Maven Jar 插件
      • conf 文件夹添加到MANIFEST.MF 的类路径中,这样您就无需在命令行中指定位置。
      • conf 文件夹中的所有文件 将被添加到类路径中,而不仅仅是 logback.xml

    要让 jar 在这种情况下运行,conf 文件夹必须放在 jar 旁边。它看起来像这样:

    path/to/jar
      | foo.jar
      | lib/
      | conf/
        | logback.xml
    

    MANIFEST.MF 看起来像这样:

    Manifest-Version: 1.0
    Built-By: $user
    Class-Path: lib/x.jar lib/y.jar lib/z.jar conf/
    version: 0.0.1-SNAPSHOT
    Created-By: Apache Maven 3.5.2
    Build-Jdk: 1.8.0_161
    Main-Class: com.company.foo.main.Main
    

    【讨论】:

      【解决方案4】:

      好的,我继续尝试。

      如果 logback 配置文件是 jar 的本地文件(在您正在运行的同一个 jar 中),则此方法有效:

      System.setProperty("logback.configurationFile", "org/package/path/your.logback.xml");
      

      有效。如果它在“任何地方”的类路径中。这真的很奇怪,因为通常调用getResource 你必须用前面的斜杠指定它:

      YourClass.class.getResource("/org/package/path/your.logback.xml") 所以不知道为什么。

      其他更奇特的资源路径(例如指定确切的 jar)似乎也不起作用。很奇怪。

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 2019-01-23
        • 2023-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多