9

我对 logback 有疑问。我设置了它(使用 maven),一切似乎都很好,除了 Logback 报告它找不到配置文件(但我能够使用默认记录器配置登录到控制台)。

[#|2013-07-03T07:55:30.843+0200|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=124;_ThreadName=Thread-2;| 07:54:39,844 |-ch.qos.logback.classic.LoggerContext [default] 中的信息 - 找不到资源 [logback.groovy]

07:54:39,844 |-ch.qos.logback.classic.LoggerContext [default] 中的信息 - 找不到资源 [logback-test.xml]

07:54:39,844 |-ch.qos.logback.classic.LoggerContext [default] 中的信息 - 找不到资源 [logback.xml]

07:54:39,847 |-CH.qos.logback.classic.LoggerContext[default] 中的信息 - 设置默认配置。|#]

我将配置文件(称为 logback.xml)放入src/main/resources我的 Maven 工件(这是一个 WAR)的文件夹中。有趣的是,如果我尝试从类路径加载配置,我会成功:

Reader r = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("logback.xml"));
StringWriter sw = new StringWriter();
char[] buffer = new char[1024];
for (int n; (n = r.read(buffer)) != -1; )
    sw.write(buffer, 0, n);
String str = sw.toString();
System.out.println(str);

打印我的示例配置文件:

[#|2013-07-03T07:55:30.844+0200|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=124;_ThreadName=Thread-2;|<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root> </configuration>|#]

pom.xml的有以下条目:

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
        </dependency>
        
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.0.13</version>
        </dependency>
        
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>

它被打包为 WAR 文件(在 EAR 文件中)。WAR文件中logback.xml的位置如下:WEB-INF/classes/logback.xml

有人知道我的设置有什么问题吗?

非常感谢您的帮助

愚蠢的羊

4

4 回答 4

6

WAR 文件中的位置正确,WEB-INF/classes.

logback 配置文档讨论了 logback.xml 文件在战争中的位置,但它没有提到任何关于 EAR 的内容。

你能试试这个链接上的信息吗?我想知道是否需要以特定方式将其打包到 EAR 中。

  1. Glassfish 3 + 耳朵 + logback.xml

(编辑:删除第二个链接,没用)

于 2013-07-03T06:57:49.293 回答
3

Logback 调用与您示例中的代码非常相似的代码,即

getClassLoader().getResourceAsStream("logback.xml");

如果 logback 找不到logback.xml,那么一定是资源对加载 logback 类的类加载器不可见。这个类加载器很可能与加载测试代码的类加载器不同,它可以找到logback.xml.

于 2013-07-03T07:24:32.493 回答
1

当您在 WAR 中交付日志框架的配置文件时,一切都按预期工作,没有任何问题。但是如果你用 EAR 尝试这个,神奇的事情会发生,日志框架找不到配置文件。它使用它的默认行为。我通过以下方式解决了它:

  1. 在 EAR 文件夹下直接创建一个新文件夹。例如,创建一个名为“classes”的新文件夹 --> MyEar/classes

  2. 将您的 logback.xml 文件放在这个新文件夹中:MyEar/classes/logback.xml

  3. 在 WAR 文件的 MANIFEST.MF 文件中,将此新文件夹添加到类路径中:Manifest-Version: 1.0 Class-Path: classes

于 2019-04-02T13:29:24.760 回答
0

所以我遇到了类似的问题,我在类路径中有 logback.xml 但没有包含在构建过​​程中。我最近切换到 gradle。即使我专门将 src/main/resources 添加到 build.gradle 的 sourceSet 中,我最初也遇到了构建中未包含的资源文件的问题。

所以我当时的解决方案是把文件类型放在include中:

includes = ["**/*.css", "**/*.wav", "**/*.mp3", "**/*.mp4", "**/*.png"]

过了一段时间,我注意到我的日志配置没有被应用。我花了很多时间调整日志并查找问题。我很快意识到该文件没有被包括在内。

String URL = "logback.xml";
System.out.println(ClassLoader.getSystemResource(URL));

我记得我必须将文件类型放入包含中。我添加了 xml 类型并且它起作用了。

sourceSets {
    main {
        resources {
            srcDirs = ["src/main/java", "src/main/resources"]
            includes = ["**/*.css", "**/*.wav", "**/*.mp3", "**/*.mp4", "**/*.png", "**/*.xml"]
        }
    }
}
于 2018-10-31T01:42:52.187 回答