playframework 一步一步来 之 日志 (二)

带着之前的疑问,我们先回顾一下日志相关的知识:

首先是SL4J,SL4J是个什么东西来着?官方解释为:“The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.” 这非常好理解,它说:“

SL4J是java的日志框架的一个接口规范,利用这个规范,它允许用户在合适的时间衔接他想要的日志框架。”可见,SL4J是一个规范性的接口,而java.util.logging,logback,log4j是SL4J的具体实现,我们在使用SL4J的时候,最好要用SL4J绑定具体框架(e.g. java.util.logging, logback, log4j)的方式,而不是直接用日志框架。

目前用的最最广泛的日志框架是log4j,而且是直接用;但是当前比较流行的用法是:SL4J+logback。

我们闲话少说,回顾一下之前的问题:play是如何实现,只定义一个Logger,就可以打印的呢?

每当遇到问题,最直接的解决方式我认为有两种:1、翻阅官方文档:https://www.playframework.com/documentation/2.3.x/SettingsLogger(这是我翻阅出来的详细地址) 2、程序调试(时间耗费或许会长一点,但是收获绝对多)。

经过一番折腾,我终于发现了端倪:

在play的源码中,出现了下图这两个似成相识的文件:

playframework 一步一步来 之 日志 (二)

呵呵,为何它俩和logback的配置文件如此相似???我们打开看看:

playframework 一步一步来 之 日志 (二)

这下醉了吧:这特么的就是logback的配置文件好吗?人家还明显说明了:“The default logback configuration that Play uses if no other configuration is provided”

再从代码角度看看,哪里用了这两个文件:

playframework 一步一步来 之 日志 (二)

标红框的地方写的清楚吧:application-logger.xml and logger.xml are deprecated methods for supplying the configuration , logback.xml is the documented method, logback-play-default.xml is the fallback that Play uses if no other file is found

人家说:“用application-logger.xml和logger.xml定义成logback的配置文件时可以滴,但是不是很好,写成logback.xml 才是王道,如果没有配置文件,也不用担心,我们还有logback-play-default.xml 这个备胎呢”  我们不禁好奇:那logback-play-dev.xml是做什么的呢? 我们看一下这个文件和那个条件语句:

“env.mode == Mode.Dev”很明显,是在说“在某种模式下”,打开logback-play-dev.xml:

playframework 一步一步来 之 日志 (二)

它说:“play在用dev的模式下”用这个。

继续追踪:

playframework 一步一步来 之 日志 (二)

发现存在三种模式:Dev、Test和Prod,由之前的代码文档和play文档推断,正常情况下应该不是Dev 模式,显然也不是Test模式,应该是Prod模式。那如何切换到其他模式呢,在play 1.XX的版本中,直接可以在application.conf中设置,但是最新的2.3版本没有了此设置,到底为何,这是另一个问题了,以后探讨。

好了,现在我们知道了,为何play只需定义一个Logger就可以直接打印日志了吧:因为play默认加载了logback-play-default.xml这个文件,这个文件中定义了日志打印的一些配置:appender和pattern。那我们如何自定义一个logback的配置文件呢?

请听下回分解。

上一篇:Python的第四天


下一篇:[原创]ubuntu14.04部署ELK+redis日志分析系统