Play 使用log4j 作为日志,使用logback 作为日志引擎,可以查看 logback 的官网文档,了解详细配置:http://logback.qos.ch/manual/configuration.html
conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel" />
name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
%coloredLevel %logger{15} - %message%n%xException{10}
name="play" level="INFO" />
name="application" level="DEBUG" />
name="com.gargoylesoftware.htmlunit.javascript" level="OFF" />
level="WARN">
ref="STDOUT" />
1. 这些默认的配置,仅仅指定了在控制台输出10行栈异常
2. 用不同颜色的代码定义异常信息的级别
3. 在生产环境,默认的配置被定义在了logback的控制台,参见文档:http://logback.qos.ch/manual/appenders.html#AsyncAppender,有关性能影响的详细信息,请参加如下文档:https://blog.takipi.com/how-to-instantly-improve-your-java-logging-with-7-logback-tweaks/
name="FILE" class="ch.qos.logback.core.FileAppender">
${application.home:-.}/logs/application.log
%date [%level] from %logger in %thread - %message%n%xException
name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">
ref="FILE" />
level="WARN">
ref="ASYNCFILE" />
ref="ASYNCSTDOUT" />
请注意,当使用不扩展默认GuiceApplicationLoader的自定义应用程序加载器时(例如,当使用编译时依赖注入时),需要手动调用LoggerConfigurator来拾取您的自定义配置。您可以使用下面的代码:
class MyApplicationLoaderWithInitialization extends ApplicationLoader {
def load(context: Context) = {
LoggerConfigurator(context.environment.classLoader).foreach {
_.configure(context.environment)
}
new MyComponents(context).application
}
}
对于任何的自定义配置,都需要指定你自己的 logback 配置
你可以通过提供一个 logback.xml文件来提供默认日志记录配置
你也可以通过系统属性,指定配置文件。这对于可以在应用程序源之外管理配置文件的生产环境特别有用。
注意:日志记录系统首先指定由系统属性指定的配置文件,其次指向conf目录中的文件,最后指定为默认值。这允许您自定义应用程序的日志记录配置,并仍然覆盖特定环境或开发人员设置。
使用 -Dlogger.resource
从类路径指定要加载的配置文件 $ start -Dlogger.resource=prod-logger.xml
使用 -Dlogger.file
指定从文件系统中加载的配置文件 $ start -Dlogger.file=/opt/prod/logger.xml
使用滚动的文件追加器配置
name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
${user.dir}/web/logs/application.log
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
application-log-%d{yyyy-MM-dd}.gz
30
%date{yyyy-MM-dd HH:mm:ss ZZZZ} [%level] from %logger in %thread - %message%n%xException
name="ACCESS_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
${user.dir}/web/logs/access.log
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
access-log-%d{yyyy-MM-dd}.gz
7
%date{yyyy-MM-dd HH:mm:ss ZZZZ} %message%n
false
name="access" level="INFO" additivity="false">
ref="ACCESS_FILE" />
level="INFO">
ref="FILE"/>
这演示了一些有用的功能:
它使用RollingFileAppender,它可以帮助管理日益增长的日志文件。
它将日志文件写入应用程序外部的目录,以便它们不受升级等影响。
这个文件追加器使用扩展的消息格式,可以由第三方日志分析提供程序(如Sumo Logic)解析。
访问记录器使用ACCESS_FILE_APPENDER路由到单独的日志文件。
所有记录器都设置为INFO的阈值,INFO是生产日志记录的常用选项。
Akka系统日志记录可以通过将akka记录器更改为INFO来完成。
name="akka" level="INFO" />
name="actors.MyActor" level="DEBUG" />
您还可以为Akka记录器配置包含有用属性(例如线程和actor地址)的追加器。有关配置Akka日志记录的更多信息,包括Logback和Slf4j集成的详细信息,请参阅Akka文档。
http://doc.akka.io/docs/akka/current/scala/logging.html
Play默认使用logback作为日志框架,但是也可以通过配置使Play使用另外一些符合 slf4j 适配器的的日志框架。要做到这一点,PlayLogback SBT插件必须通过disablePlugins禁用:
lazy val root = (project in file("."))
.enablePlugins(PlayScala)
.disablePlugins(PlayLogback)
上边介绍了一个自定义框架的使用,下边介绍log4j 使用例子:
libraryDependencies ++= Seq(
"org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.4.1",
"org.apache.logging.log4j" % "log4j-api" % "2.4.1",
"org.apache.logging.log4j" % "log4j-core" % "2.4.1"
)
加载库和SLF4J适配器后,可以像通常一样在命令行上设置log4j.configurationFile系统属性。
如果在Play做需要的模式上自定义,你可以使用LoggerConfigurator 进行其他的定义,为此可以添加一个 logger-configurator.properties 到classpath 下:
play.logger.configurator=Log4J2LoggerConfigurator
然后可以扩展LoggerConfigurator 做一些自定义
import java.io.File
import java.net.URL
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.core._
import org.apache.logging.log4j.core.config.Configurator
import play.api.{Mode, Environment, LoggerConfigurator}
class Log4J2LoggerConfigurator extends LoggerConfigurator {
override def init(rootPath: File, mode: Mode.Mode): Unit = {
val properties = Map("application.home" -> rootPath.getAbsolutePath)
val resourceName = if (mode == Mode.Dev) "log4j2-dev.xml" else "log4j2.xml"
val resourceUrl = Option(this.getClass.getClassLoader.getResource(resourceName))
configure(properties, resourceUrl)
}
override def shutdown(): Unit = {
val context = LogManager.getContext().asInstanceOf[LoggerContext]
Configurator.shutdown(context)
}
override def configure(env: Environment): Unit = {
val properties = Map("application.home" -> env.rootPath.getAbsolutePath)
val resourceUrl = env.resource("log4j2.xml")
configure(properties, resourceUrl)
}
override def configure(properties: Map[String, String], config: Option[URL]): Unit = {
val context = LogManager.getContext(false).asInstanceOf[LoggerContext]
context.setConfigLocation(config.get.toURI)
}
}