Spring - 异常不会记录到文件

时间:2016-05-25 08:42:52

标签: spring logging logback slf4j

我目前正在使用SLF4J API进行日志记录。

每当在运行时抛出异常时,完整的错误堆栈跟踪不会记录到文件,它只会打印到控制台。我正在使用eclipse。

以下是我的logback.xml 代码(目前位于WEB-INF下的classes文件夹中)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>

<configuration>
    <!-- Specify here the path of the folder you want to save your logs -->
    <property name="LOGFILE_PATH" value="C:/Logs" />

    <!-- All logging will be redirected/ printed to console. -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd hh:mm:ss a} [%thread] %-5level %logger{50} - %rEx %msg%n </Pattern>
        </layout>
    </appender>

    <!-- Send log to file -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOGFILE_PATH}/spring-mybatis-log.log</File>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd hh:mm:ss a} [%thread] %-5level %logger - %rEx %msg%n</pattern>
        </layout>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGFILE_PATH}/spring-mybatis-log-%d{yyyy-MM-dd}-%i.txt
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>
  1. 上述文件是否遗漏/错误?

  2. 是否可以记录(到文件)将要打印到控制台的所有文本?

  3. spring(或项目本身)如何读取logback.xml文件?如果我将其重命名并将其放在另一个文件夹中该怎么办?

  4. 如何创建一个,其中包含所有级别(INFO,DEBUG,ERROR,WARN等)?

2 个答案:

答案 0 :(得分:1)

回答你的问题:

  1. 我发布的文件中没有任何内容对我来说显然是错误的,虽然我没有尝试实际运行它。
  2. 就像你这样做的方式很好,有两个appender,一个转到文件,另一个转到控制台。
  3. 默认情况下,Logback会在logback.xml文件的类路径中查找。有关详细信息,请参阅configuration page of the manual。它到达那里的方式取决于你的构建系统。使用Maven时,我建议将其放在src/main/resources中。但如果它在您的网络应用中部署时WEB-INF/classes结束,那应该可行。如果不管你在logback.xml文件中放了什么,你只得到控制台输出(尝试添加语法错误或重命名文件进行测试),这就是我首先要看的,以确保Logback正在拾取文件对。如果它找不到文件,它将默认显示在控制台上的所有内容,但我认为它在开头显示它正在这样做的警告。如果它正在拾取文件,您可以尝试将debug="true"放在<configuration>元素中,以查看是否存在错误导致其未按照您期望的方式使用appender
  4. 如您所述,指定“DEBUG”级别的日志记录也将获得所有更高级别。
  5. 如果问题是从Spring的日志记录没有到达你想要的地方,而你的应用程序的日志记录工作正常,你可能需要重定向Spring(使用Apache Commons Logging)来使用SLF4J代替。为此,请删除commons-logging依赖项并添加jcl-over-slf4j库。这将模拟commons-logging调用,并让它们指向SLF4J。有关详细信息,请参阅this blog post的“使用SLF4J”部分。

答案 1 :(得分:0)

您的配置看起来没问题,但您可以尝试使用根级别 INFO 而不是 DEBUG ,如果您有像spring,hibernate等框架,则可以使用其他级别对他们来说像是:

<logger name="org.hibernate" level="OFF" />
<logger name="org.springframework" level="INFO" />
<logger name="org.springframework.web.servlet.mvc" level="INFO" />