playframework - 演员记录器未写入日志文件
问题描述
在我的 Play-Scala 应用程序中,这些log.info("...")
命令被忽略了。
我咨询了以下内容:
我的文件的相关内容application.conf
是:
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "INFO"
log-config-on-start = on
}
...
和logback.xml
:
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/var/log/foo/application.log</file>
<encoder>
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%coloredLevel %logger{15} - %message%n%xException{10}</pattern>
</encoder>
</appender>
<appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT" />
</appender>
<logger name="play" level="INFO" />
<logger name="application" level="INFO" />
<logger name="akka" level="INFO" />
<!-- Off these ones as they are annoying, and anyway we manage configuration ourselves -->
<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" />
<root level="WARN">
<appender-ref ref="ASYNCFILE" />
<appender-ref ref="ASYNCSTDOUT" />
</root>
</configuration>
在我的代码中,我有类似的东西:
class MyActor extends Actor with ActorLogging {
override def receive = {
case msg =>
println("This should show up in the console")
log.info("log this message", msg)
}
}
然而,我的application.log
文件不包含来自命令的任何消息log.info
,即使终端显示了println
命令的输出:
2018-07-20 00:02:59,109 [INFO] from akka.event.slf4j.Slf4jLogger in application-akka.actor.default-dispatcher-4 - Slf4jLogger started
2018-07-20 00:02:59,145 [INFO] from akka.actor.ActorSystemImpl in application-akka.actor.default-dispatcher-4 - {
# merge of play/reference-overrides.conf @ jar:file:/root/.ivy2/cache/com.typesafe.play/play_2.11/jars/play_2.11-2.6.9.jar!/play/reference-overrides.conf: 20,reference.conf @ jar:file:/root/.ivy2/cache/com.typesafe.akka/akka-actor_2.11/jars/akka-actor_2.11-2.5.14.jar!/reference.conf: 92
"actor" : {
# reference.conf @ jar:file:/root/.ivy2/cache/com.typesafe.akka/akka-actor_2.11/jars/akka-actor_2.11-2.5.14.jar!/reference.conf: 717
# Additional serialization-bindings that are replacing Java serialization are
# defined in this section for backwards compatibility reasons. They are included
# by default but can be excluded for backwards compatibility with Akka 2.4.x.
...
# system properties
"user" : {
# system properties
"dir" : "/home",
# system properties
"home" : "/root",
# system properties
"language" : "en",
# system properties
"name" : "root",
# system properties
"timezone" : "Etc/UTC"
},
1/jars/akka-actor_2.11-2.5.14.jar!/version.conf: 1
"version" : "2.5.14"
}
ult-dispatcher-2 - Using the following cache for assets configuration:
enabledCaching = false
enabledCacheControl = false
defaultCacheControl = public, max-age=3600
aggressiveCacheControl = public, max-age=31536000, immutable
configuredCacheControl:
ork.com/documentation/latest/Filters>):
play.filters.csrf.CSRFFilter
play.filters.headers.SecurityHeadersFilter
play.filters.hosts.AllowedHostsFilter
fault-dispatcher-2 - Application started (Dev)
如内容application.log
所示,文件中的行log-config-on-start = on
正在application.conf
工作。
如何获取log.info
写入application.conf
文件的命令?
解决方案
如果您将 Play 框架与 Akka 一起使用,则可以利用 Play 框架本身提供的 Logging 优势。Play 框架为您创建了 Actor 系统,您可以使用 PlayLogging 记录消息。
如下配置 logback.xml 文件:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
</appender>
<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT" />
</appender>
<root level="INFO">
<appender-ref ref="ASYNCSTDOUT" />
</root>
</configuration>
然后,您可以通过扩展 PlayLogging 特征来利用 Play 框架提供的日志记录支持。
class SampleTestActor extends Actor with PlayLogging {
def receive: Receive = {
case m: AnyEvent =>
logger.info(s"Received metric event $m")
}
}
推荐阅读
- shell - 如果我的用户名提示不正确,我想打破它
- r - 如何使用来自其他两个数据框的信息构建数据框
- java - ArrayDeque 操作
- php - 使用 PHPMailer 对 gmail 进行身份验证
- c# - .NET Core 3.1 EntityFramework Core DatabaseModel 没有给出参数
- python - 使用 Keras 的模型 FIT 仅在 CPU 上运行良好,在 GPU 损失 NaN 上运行良好
- python - 帮助将代码从 MATLAB 翻译成 python
- docker - 如何在 Docker 中运行遵循数据库查询的连接命令
- reactjs - 无法禁用 Google Analytics page_view 事件
- c# - Azure 存储数据移动以较低的带宽