如何在Play 2.4中正确记录应用程序的DEBUG和INFO信息?

3
根据Play 2.4文档,默认应用程序日志记录级别应设置为DEBUG,对吗?
<logger name="play" level="INFO" />
<logger name="application" level="DEBUG" />

然而,在我的日志中,我只看到警告和错误级别的信息。

例如,以下代码:

class Application extends Controller {

  val log = Logger(this.getClass)

  def index = Action {
    log.debug("debug")
    log.info("info")
    log.warn("warn!")
    log.error("ERROR")
    Ok("ok")
  }    
}

...只会在标准输出中产生这个结果(同样也是在logs/application.log中):

[warn] c.Application - warn!
[error] c.Application - ERROR

如何正确记录应用程序的DEBUG和INFO消息?

使用Play 2.4.3,基本上采用默认配置,并且没有任何conf/logback.xml。(基于SBT的项目设置,没有Typesafe Activator.)


澄清一下,我知道我可以为Logback创建自定义配置文件(conf/logback.xml)。这在我链接到的文档中非常明显。

这里的重点是:如果我的需求非常普通(获取我的应用程序的消息日志,还有DEBUG和INFO),我真的需要创建一个冗长的自定义配置文件吗?人们会认为如此基本的事情应该默认工作,或者只需要一些最小的配置选项。如果你注意到了,Play Framework被誉为具有良好的开发经验,许多与之相关的事物都遵循“约定优于配置”的原则。

2个回答

3

我从我们后端聊天中的同事学到了什么:

你的应用控制器可能驻留在controllers包中,对吗?当你执行Logger(getClass) <- getClass被用来查找Application的包路径,然后将是controllers.Application,因此你可以添加一行<logger name="controllers" level="DEBUG" />,以便从controllers包中的类获取调试输出。

有一种方法可以不使用自定义配置(在快速实验中适用于INFO但不适用于DEBUG)。但与使用更精细的记录器相比,它具有显着的缺点(如我的问题所述)。

“应用程序”记录器是默认的记录器名称,如果您直接使用Logger对象(如 Logger.info("Hello, world!"))而不是创建自己的实例,则会使用它。但是,这很快就会产生负面影响,因为您将失去对日志的细粒度配置,并且只能“全局”过滤日志记录,所以我从不使用它。另外,您的日志将不会披露日志语句的位置,而只会打印它在“应用程序”中。 我不想要这些缺点,因此我创建了 conf/logback.xml(从 default 开始复制),并添加了类似于以下内容的自定义记录器:
<logger name="controllers" level="DEBUG" />
<logger name="services" level="DEBUG" />
<logger name="repositories" level="DEBUG" />

现在我的val log = Logger(this.getClass)方法可以使用了。
但是我不明白为什么需要30-40行自定义XML来完成最基本的事情,这对开发体验并不好。如果有Play的支持者或开发人员能够证明为什么默认配置不能解决这个问题,我很想听听他们的意见。

这太疯狂了。 - Andy Hayden

0

在conf文件夹中根本没有.xml文件吗? 添加这行代码应该会解决你的问题:

<logger name="controllers" level="DEBUG" />

您也可以在application.conf文件中覆盖它,尽管它将来会被弃用:

logger.controllers=DEBUG

1
我正在寻找一种在没有自定义配置的情况下使日志工作的方法。我想要的实在是太基础了,以至于让我感到奇怪的是Play需要一个冗长的自定义XML才能使其运行。 - Jonik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接