【问题标题】:Spring - Exceptions do not log to a fileSpring - 异常不会记录到文件中
【发布时间】:2017-02-09 15:42:28
【问题描述】:

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

无论何时在运行时抛出异常,完整的错误堆栈跟踪都不会记录到文件中,它只会打印到控制台。我正在使用日食。

这是我的 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等)的root

【问题讨论】:

    标签: spring logging logback slf4j


    【解决方案1】:

    回答您的问题:

    1. 您发布的文件在我看来没有明显错误,尽管我没有尝试实际运行它。
    2. 就像你做的那样很好,有两个附加程序,一个用于文件,另一个用于控制台。
    3. 默认情况下,Logback 在类路径中查找 logback.xml 文件。详情请参阅configuration page of the manual。它到达那里的方式取决于您的构建系统。使用 Maven 时,我建议将其放入 src/main/resources。但是,如果它在部署到您的 Web 应用程序时以 WEB-INF/classes 结尾,那应该可以工作。如果无论您在 logback.xml 文件中放入什么内容,您都只会获得控制台输出(尝试添加语法错误或重命名文件以进行测试),这就是我首先要查看的内容,以确保 Logback 正在获取文件正确的。如果找不到文件,它将默认仅在控制台上显示所有内容,尽管我认为它在开始时会显示警告,表明它正在这样做。如果它正在拾取文件,您可以尝试将 debug="true" 放入 &lt;configuration&gt; 元素中,以查看是否存在导致它无法按预期方式使用附加程序的错误。
    4. 正如您所做的那样,指定日志记录的“DEBUG”级别也将获得所有更高级别。

    如果问题是来自 Spring 的日志记录没有到达您想要的位置,而 您的 应用程序的日志记录工作正常,您可能需要重定向 Spring(它使用 Apache Commons Logging)以使用 SLF4J反而。为此,请删除 commons-logging 依赖项并添加 jcl-over-slf4j 库。这将模拟 commons-logging 调用并让它们指向 SLF4J。有关详细信息,请参阅this blog post 的“使用 SLF4J”部分。

    【讨论】:

      【解决方案2】:

      您的配置看起来不错,但是您可以尝试使用根级别 INFO 而不是 DEBUG 并且如果您有 spring、hibernate 等框架。Logback 允许您使用其他级别对他们来说是这样的:

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

      【讨论】:

        猜你喜欢
        • 2012-02-24
        • 2018-01-14
        • 2019-07-06
        • 1970-01-01
        • 2021-06-08
        • 2014-08-20
        • 2020-02-27
        • 1970-01-01
        相关资源
        最近更新 更多