【问题标题】:Set logging level to debug in Playframework 2.0 production?在 Playframework 2.0 生产中将日志记录级别设置为调试?
【发布时间】:2025-12-16 17:10:02
【问题描述】:

在我的conf/application.conf 中,我将应用程序的日志记录级别设置为DEBUG

logger.application=DEBUG

当我sbt run 我的应用程序时,这很好用。但是,当我使用sbt start 在生产模式下运行它时,日志级别会被覆盖为INFO

在生产中运行时,有没有办法强制 play 使用 DEBUG 作为我的日志级别?

【问题讨论】:

    标签: playframework playframework-2.0


    【解决方案1】:

    您有 two different loggers : play 记录器和 application 记录器。 以下是开发模式的 logger.xml 示例:

    <configuration>
        <conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern>
            </encoder>
        </appender>
    
        <logger name="play" level="INFO" />
        <logger name="application" level="DEBUG" />
    
        <root level="ERROR">
            <appender-ref ref="STDOUT" />
        </root>
    
    </configuration>
    

    这里播放记录器设置为日志级别> INFO,您的应用程序记录器(您在执行Logger.debug/warn/error 时使用的记录器)设置为日志级别> DEBUG。根级别是所有记录器的默认级别,但由于每个记录器都定义了自己的级别,因此不需要它。

    您可以创建一个 prod-logger.xml 文件并使用以下命令以 prod 模式启动您的应用程序:start -Dlogger.resource=conf/prod-logger.xml

    这是我用于具有两个附加程序的生产服务器的配置,用于将 level > DEBUG 存储在一个文件中,将 level > WARN 存储在另一个文件中。还有一个 TimeBasedRollingPolicy 可以让文件每天滚动。

    <configuration>
        <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${application.home}/logs/debug_log.log</file>
            <encoder>
                <pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>DEBUG</level>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${application.home}/logs/debug_log.%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>
    
        <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${application.home}/logs/warn_log.log</file>
            <encoder>
                <pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>WARN</level>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${application.home}/logs/warn_log.%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>60</maxHistory>
            </rollingPolicy>
        </appender>
    
        <logger name="play" level="INFO"/>
        <logger name="application" level="INFO" />
    
        <root level="WARN">
            <appender-ref ref="FILE_DEBUG"/>
            <appender-ref ref="FILE_WARN"/>
        </root>
    </configuration>
    

    有关日志记录配置的更多详细信息,请查看Logback

    【讨论】:

    • 这行得通,但我仍然不明白为什么生产中的 application.conf 中的 'logger.application=DEBUG' 被忽略了。
    • 确切地说,您没有将调试消息存储在 FILE_DEBUG 附加程序中,因为根和应用程序都设置为不允许调试日志级别的信息和警告级别。为了实现您的建议,我必须更改 'root level="DEBUG"' 中的 'root level="WARN"' 和 ="调试" />。无论如何,感谢您提供的非常有用的示例!