Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Logback can';即使logback.xml存在(在类路径上),也找不到它_Java_Maven_War_Logback - Fatal编程技术网

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

Java Logback can';即使logback.xml存在(在类路径上),也找不到它,java,maven,war,logback,Java,Maven,War,Logback,我对logback有意见。我设置了它(使用maven),除了Logback报告它找不到配置文件外,其他一切似乎都很好(但是我可以使用默认的logger配置登录到控制台) [#|2013-07-03T07:55:30.843+0200 | INFO | glassfish3.1.2 | javax.enterprise.system.std.com.sun.enterprise.server.logging | u ThreadID=124;| u ThreadName=Thread-2;| 07

我对logback有意见。我设置了它(使用maven),除了Logback报告它找不到配置文件外,其他一切似乎都很好(但是我可以使用默认的logger配置登录到控制台)

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

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

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

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

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

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>|#]
它打包为WAR文件(在EAR文件中)。WAR文件中logback.xml的位置如下:
WEB-INF/classes/logback.xml

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

非常感谢你的帮助


stupidSheep

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

本文讨论了logback.xml文件在war中的位置,但没有提到任何关于EAR的内容

你能试试这个链接上的信息吗?我想知道它是否需要用一种特殊的方式塞进耳朵里


  • (编辑:第二个链接已删除,不起作用)

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

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

    如果logback找不到
    logback.xml
    ,则资源对于加载logback类的类加载器必须是不可见的。这个类加载器很可能不同于加载测试代码的类加载器,它可以找到
    logback.xml

    ,因此我遇到了类似的问题,在类路径中有logback.xml,但没有包含在构建过程中。我最近转到了格拉德尔。最初,我的资源文件没有包含在构建中,尽管我专门将src/main/resources添加到build.gradle的sourceSet中,但我遇到了一些问题

    因此,当时我的解决方案是将文件的类型放入

    includes = ["**/*.css", "**/*.wav", "**/*.mp3", "**/*.mp4", "**/*.png"]
    
    一段时间过去了,我注意到我的日志配置没有被应用。我花了大量时间调整日志并查找问题。我很快意识到文件没有包括在内

    String URL = "logback.xml";
    System.out.println(ClassLoader.getSystemResource(URL));
    
    我记得我必须把文件类型放在include中。我添加了xml类型,它成功了

    sourceSets {
        main {
            resources {
                srcDirs = ["src/main/java", "src/main/resources"]
                includes = ["**/*.css", "**/*.wav", "**/*.mp3", "**/*.mp4", "**/*.png", "**/*.xml"]
            }
        }
    }
    

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

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

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

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


  • 您确定您使用的是war的logback,而不是应用服务器的logback吗?是的,这是一个输入错误(我在问题中修复了它)。在您的第一个链接(Glassfish 3+ear+logback.xml)中提出的解决方案有效!!非常感谢!我只需添加一个新的Maven模块,并将“logback.xml”添加到src/main/resources文件夹中。然后,我不得不将新创建的maven模块作为编译依赖项添加到WAR模块中。成功了!第二个链接对我不起作用(尽管我创建了MANIFEST.MF文件并添加了类路径条目,但logback仍然报告它找不到配置..安威,再次感谢!欢迎您,sheep先生,感谢您提出的问题,我从未想过logback.xml应该位于EAR中的什么位置,所以现在我也知道了:)嗯,我对类加载器的工作方式不太了解。但这两次(一次在启动期间,一次在部署之后)代码都是在容器内执行的(GlassFish 3)。一次是在EAR文件的启动/部署期间,第二次是在应用程序加载时(由JSF@ManagedBean加载-在我使用记录器的同一个类中).Anway,使用额外jar文件的解决方案奏效了(请参阅接受的答案)。无论如何,谢谢!
    sourceSets {
        main {
            resources {
                srcDirs = ["src/main/java", "src/main/resources"]
                includes = ["**/*.css", "**/*.wav", "**/*.mp3", "**/*.mp4", "**/*.png", "**/*.xml"]
            }
        }
    }