Play应用的调试、日志记录与Web服务调用
立即解锁
发布时间: 2025-08-19 00:52:15 阅读量: 1 订阅数: 2 


精通Play框架:构建可扩展的Scala应用
# Play应用的调试、日志记录与Web服务调用
## 1. 调试与日志记录概述
调试和日志记录是开发者用于识别应用程序中错误或意外行为根本原因的重要工具。调试的目的是找出代码中的缺陷或痛点,而日志记录则能提供应用程序状态及处理各阶段的信息。
### 1.1 调试Play应用
Play应用可以使用Java平台调试器架构(JPDA)传输进行调试。根据相关文档,JPDA传输是调试器与被调试的虚拟机(目标VM)之间的通信方法,通信是面向连接的,一方作为服务器监听连接,另一方作为客户端连接到服务器,JPDA允许调试器应用程序或目标VM充当服务器。
可以使用以下命令以调试模式启动控制台:
- 使用`play`:`play debug`
- 使用`activator`:`activator -jvm-debug <port>`
- 使用`sbt`:`sbt -jvm-debug <port>`
这些命令是通过以下调用选项启动目标VM进入调试模式的包装器:
```plaintext
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=<port>
```
`play`命令使用`JPDA_PORT`或9999环境变量作为端口变量。设置`JPDA_PORT`为所需端口后,目标VM将监听该端口。
### 1.2 配置IDE进行调试
以IntelliJ Idea为例,配置IDE进行调试的步骤如下:
1. 从“Run”菜单中选择“Edit Configurations…”,会弹出一个对话框。
2. 点击“+”,会出现一个类似的菜单。
3. 选择“Remote”,并更新“Name”和“Port”字段。
4. 点击IDE右上角现在可见的绿色虫子图标,即可开始调试应用程序。
### 1.3 在Scala控制台中进行实验
在Scala项目中,Scala控制台非常有用,Play应用的控制台中也提供了相同的控制台。在应用程序控制台中执行`console`命令即可进入Scala控制台:
```plaintext
[app]$ console
[info] Compiling 3 Scala sources to /home/app/target/scala-2.10/classes...
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_60).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
```
然而,只能调用模型或工具类中的方法。如果这些包中的类或对象使用`Play.application.configuration`或尝试从数据库或其他Play工具中获取数据,则无法实例化它们,因为大多数Play组件需要访问当前运行的Play应用程序实例。导入`play.api.Play.current`可以部分解决这个问题,但仍然需要一个正在运行的应用程序作为当前应用程序。
以下是在Scala控制台中创建并启动应用程序,然后导入`play.api.Play.current`的示例:
```scala
scala> :pas
// Entering paste mode (ctrl-D to finish)
import play.api.Play
val application = new DefaultApplication(new java.io.File("."), this.getClass.getClassLoader, None, Mode.Dev)
Play.start(application)
import play.api.Play.current
```
如果想调用操作并检查不同输入的结果,应使用`test:console`命令而不是`console`命令:
```plaintext
[app] $ test:console
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_60).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :pas
// Entering paste mode (ctrl-D to finish)
import play.api.test.Helpers._
import play.api.test._
import play.api.Play
val application = FakeApplication()
Play.start(application)
import play.api.Play.current
// Exiting paste mode, now interpreting.
```
### 1.4 日志记录
日志记录是记录应用程序中事件发生时间和原因数据的行为。如果处理得当,日志非常有用,否则只是噪音。通过查看日志输出,很有可能确定事件的原因。日志不仅有助于处理应用程序错误,还能保护应用程序免受滥用和恶意攻击,并帮助理解业务的不同方面。
#### 1.4.1 Play的日志记录API
Play通过`play.api.Logger`暴露日志记录API。以下是其类和对象定义:
```scala
class Logger(val logger: Slf4jLogger) extends LoggerLike
object Logger extends LoggerLike {
...
val logger = LoggerFactory.getLogger("application")
def apply(name: String): Logger = new Logger(LoggerFactory.getLogger(name))
def apply[T](clazz: Class[T]): Logger = new Logger(LoggerFactory.getLogger(clazz))
...
}
```
`LoggerLike`特质是`Slf4jLogger`的包装器。默认情况下,所有应用程序日志映射到名为`application`的`Logger`,与Play相关的日志映射到名为`Play`的`Logger`。
导入`play.api.Logger`后,可以使用以下方式使用默认日志记录器或定义自定义日志记录器:
- 使用默认日志记录器:
```scala
import play.api.Logger
object Task{
def delete(id:Long) = {
logger.debug(s"deleting task with id $id")
...
}
}
```
- 使用类名作为日志记录器:
```scala
import play.api.Logger
object Task{
private lazy val taskLogger = Logger(getClass)
def delete(id:Long) = {
taskLogger.debug(s"deleting task with id $id")
...
}
}
```
- 使用自定义名称作为日志记录器:
```scala
import play.api.Logger
object Task{
private lazy val taskLogger = Logger("application.model")
def delete(id:Long) = {
taskLogger.debug(s"deleting task with id $id")
...
}
}
```
#### 1.4.2 Play中的日志配置
Play框架使用Logback作为日志记录引擎,默认配置如下:
```xml
<configuration>
<conversionRule conversionWord="coloredLevel"
converterClass="play.api.Logger$ColoredLevel" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${application.home}/logs/application.log</file>
<encoder>
<pattern>%date - [%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>
<logger name="play" level="INFO" />
<logger name="application" level="DEBUG" />
<!-- Off these ones as they are annoying, and anyway we manage
configuration ourself -->
<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="ERROR">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
```
0
0
复制全文
相关推荐










