PlayFramework,使用 xml 的自定义日志记录配置

PlayFramework, custom logging configuration with xml

我使用 2.3.6 播放框架,我已经使用自定义 xml 配置文件设置日志输出。

这是:

<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${user.dir}/logs/application.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- Daily rollover with compression -->
        <fileNamePattern>application-%d{yyyy-MM-dd}.log</fileNamePattern>
        <!-- keep 30 days worth of history -->
        <maxHistory>5</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%date{yyyy-MM-dd HH:mm:ss ZZZZ} - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
    </encoder>
</appender>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern>
    </encoder>
</appender>

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

<logger name="play" level="DEBUG">
    <appender-ref ref="STDOUT" />
</logger>

<logger name="application" level="DEBUG">
    <appender-ref ref="STDOUT" />
</logger>

<logger name="actors" level="DEBUG"/>
<logger name="models" level="DEBUG"/>

<logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF" />
<logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF" />
<logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF" />
<logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" />
<logger name="com.google.api.client.http.HttpTransport" level="OFF"/>

有了那个配置,我的输出线加倍了,我的意思是:

[info] play - database [default] connected at jdbc:postgresql://1.1.1.1/project.dev
[info] play - database [default] connected at jdbc:postgresql://1.1.1.1/project.dev
[info] play - Application started (Dev)
[info] play - Application started (Dev)

你能解释一下为什么吗?

我不明白播放记录器和应用程序记录器之间的区别。 我认为层次结构是 rootLogger -> playLogger -> applicationLogger -> 我的记录器。

package actors

import akka.actor.Props
import play.api.Logger

object MainCtrl {

  val log = Logger("actors.stat.MainCtrl")

我不明白为什么 play 和 application logger 不能只是一个 logger

不同的是,一个是框架的Logger"Play"(你不控制这个的输出,你可以设置level),一个是你实际应用的Logger。

尝试从 "play" 记录器中删除附加程序。

输出文件中出现重复行的原因是Appenders 堆积。 根据 logback 配置文档:

By default, appenders are cumulative: a logger will log to the appenders attached to itself (if any) as well as all the appenders attached to its ancestors. Thus, attaching the same appender to multiple loggers will cause logging output to be duplicated.