即使它存在(在类路径上),Logback也找不到logback.xml

时间:2013-07-03 06:12:26

标签: java maven war logback

我遇到了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 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 无法找到资源[logback.groovy]

     

07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 无法找到资源[logback-test.xml]

     

07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 无法找到资源[logback.xml]

     

07:54:39,847 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 设置默认配置。   |#]

我将配置文件(称为logback.xml)放入我的Maven工件的src/main/resources文件夹(这是一个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

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

非常感谢你的帮助

stupidSheep

4 个答案:

答案 0 :(得分:6)

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

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

您可以尝试通过此链接获取信息吗?我想知道是否需要以特定的方式将其打包到EAR中。

  1. Glassfish 3 + ear + logback.xml
  2. (编辑:删除了第二个链接,没有工作)

答案 1 :(得分:3)

Logback调用与示例中的代码非常相似的代码,即getClassLoader()。getResourceAsStream(“logback.xml”)。如果logback找不到logback.xml,那么必须是资源对加载logback类的类加载器不可见。这个类加载器很可能与加载了可以找到logback.xml的测试代码的类加载器不同。

答案 2 :(得分:1)

当您在WAR中交付日志记录框架的配置文件时,一切都会按预期进行,并且没有任何问题。但是,如果您使用EAR尝试此操作,则会发生一些不可思议的事情,日志记录框架将找不到配置文件。并且使用默认行为。 我通过以下方法解决了该问题:

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

  2. 将logback.xml文件放置在此新文件夹中: MyEar / classes / logback.xml

  3. 在WAR文件的MANIFEST.MF文件中,将此新文件夹添加到 类路径:     清单版本:1.0     类路径:类

答案 3 :(得分:0)

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

所以我当时的解决方案是将文件类型放入包含:

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"]
        }
    }
}