如何在 Play 2.4 中正确记录应用程序 DEBUG 和 INFO 消息?
How to get application DEBUG and INFO messages properly logged in Play 2.4?
从Play 2.4 documentation开始,默认的应用程序日志记录级别应该是DEBUG,对:
<logger name="play" level="INFO" />
<logger name="application" level="DEBUG" />
但是,在我的日志中,我只收到 WARN 和 ERROR 级别的消息。
例如这段代码:
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")
}
}
...只在 stdout 中产生这个(在 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
)。从我在第一句话中链接到的文档中可以明显看出这一点。
这里的 要点 是:如果我的需求非常普通(记录我的应用程序的消息,还有调试和信息),我真的需要创建一个冗长的自定义配置文件吗?人们会假设一个像默认情况下一样基本的东西,或者使用一些最小的配置选项。如果你注意到了,Play Framework 被吹捧为 good developer experience,并且很多东西都遵循“约定优于配置”的原则。
您的 conf 文件夹中根本没有 .xml 文件?
添加此行应该会为您解决此问题:
<logger name="controllers" level="DEBUG" />
您也可以在 application.conf 文件中覆盖它,尽管将来会弃用它:
logger.controllers=DEBUG
我从 colleague 后台聊天中学到的东西:
Your Application controller probably resides in the controllers
package, right? When you do Logger(getClass)
<- getClass is used to
look up the package path to Application, which then would be
controllers.Application
so you can for example add a line <logger
name="controllers" level="DEBUG" />
to get debug output from classes
in the controllers package
是一种没有自定义配置的方法(它适用于 INFO 但不适用于快速实验的 DEBUG)。但与使用更多粒度记录器(如我的问题)相比,它有 重大缺点。
The "application" logger is the default logger name that's used if you
use the Logger object directly, like Logger.info("Hello, world!")
, as
opposed to creating your own instances
[...]
But that will clearly backfire quickly since then you lose granular
configuration of your logs and can only filter the logging "globally",
so I never use that.
Also, your logs will not disclose where the log statement is
made but instead just print that it's in "application"
我不想要这些缺点,所以我确实创建了 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 几乎可以想象的最基本的东西是多么好 developer experience。如果某些 Play 倡导者或开发人员可以证明为什么默认配置不能开箱即用,我很想听听。
从Play 2.4 documentation开始,默认的应用程序日志记录级别应该是DEBUG,对:
<logger name="play" level="INFO" />
<logger name="application" level="DEBUG" />
但是,在我的日志中,我只收到 WARN 和 ERROR 级别的消息。
例如这段代码:
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")
}
}
...只在 stdout 中产生这个(在 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
)。从我在第一句话中链接到的文档中可以明显看出这一点。
这里的 要点 是:如果我的需求非常普通(记录我的应用程序的消息,还有调试和信息),我真的需要创建一个冗长的自定义配置文件吗?人们会假设一个像默认情况下一样基本的东西,或者使用一些最小的配置选项。如果你注意到了,Play Framework 被吹捧为 good developer experience,并且很多东西都遵循“约定优于配置”的原则。
您的 conf 文件夹中根本没有 .xml 文件? 添加此行应该会为您解决此问题:
<logger name="controllers" level="DEBUG" />
您也可以在 application.conf 文件中覆盖它,尽管将来会弃用它:
logger.controllers=DEBUG
我从 colleague 后台聊天中学到的东西:
Your Application controller probably resides in the controllers package, right? When you do
Logger(getClass)
<- getClass is used to look up the package path to Application, which then would becontrollers.Application
so you can for example add a line<logger name="controllers" level="DEBUG" />
to get debug output from classes in the controllers package
是一种没有自定义配置的方法(它适用于 INFO 但不适用于快速实验的 DEBUG)。但与使用更多粒度记录器(如我的问题)相比,它有 重大缺点。
The "application" logger is the default logger name that's used if you use the Logger object directly, like
Logger.info("Hello, world!")
, as opposed to creating your own instances[...]
But that will clearly backfire quickly since then you lose granular configuration of your logs and can only filter the logging "globally", so I never use that. Also, your logs will not disclose where the log statement is made but instead just print that it's in "application"
我不想要这些缺点,所以我确实创建了 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 几乎可以想象的最基本的东西是多么好 developer experience。如果某些 Play 倡导者或开发人员可以证明为什么默认配置不能开箱即用,我很想听听。