我使用的播放2.1。 我使用的是默认的记录play.api.Logger。 我感到困惑的是如何工作的。
在该方法我Scala代码,在类“com.myapp.tickets”线“getPayment()”这样的
Logger.info("getTickets")
产生这样的日志信息。
14:58:58.005 INFO application play.api.LoggerLike$class info getTickets
我的应用程序logger.xml模式
%d{HH:mm:ss.SSS} %-5level %logger %class %method %msg%n
我的问题是,%记录器告诉我:“应用程序”%阶级告诉我:“play.api.LoggerLike $类和%方法告诉我,‘信息’,我知道这一切。我当然希望避免增加更多的克鲁夫特到消息本身(如类名或方法)。
如果我打印出来的调用堆栈(%来电者),那么2级了我想要的东西,但似乎没有一个可行的方法来生成日志。
如何将其配置为输出应用特定的类和方法,而不是类和记录器本身的方法是什么?
的logback模式:
%d{HH:mm:ss.SSS} [%thread] %-5level %class{36}.%M %L - %msg%n
结果:
14:53:47.816 [http-bio-8080-exec-3] DEBUG c.f.s.w.s.i.example.ExServiceImpl.getStatus 993 - blocked-->0
%class{0}
将仅输出的类别的名称,所以不是:
com.something.MyClass
你会得到:
MyClass
这是我的logback模式是如何正常的样子:
%d{HH:mm:ss} [%thread] %-5p %class{0} - %m%n
您还可以添加的方法,如果你有兴趣做这行:
%d{HH:mm:ss} [%thread] %-5p %class{0}.%method:%L - %m%n
旧线,但共同的问题。 Play使用SLF4J周围的包装,这将导致被记录为[记录仪$ ALogger]或[应用]一切。 有记录实际的类名称的几种方法。
把这个在你的类:
private static org.slf4j.Logger logger = play.logger.underlying();
并把这个在你的方法:
logger.info("Your message");
另一种选择是,以取代所有的记录器的调用与此,但它会增加开销,因为它要记录的东西,每次来获取潜在的对象:
Logger.underlying().info("Your message");
我不知道,这真的是你想要什么,但你试试这个? :
记录仪(this.getClass())。信息( “getTickets”)
我在放弃该游戏似乎默认为与它记录仪单application.log方法的过程。 我的应用程序需要的是那种-的细粒记录和运行调整是直线上升的logback这样做很好,当类名== Logger名称。 我有不错的成功将在我的控制器一样只是“老同学” ......
package controllers
import play.api._
import play.api.mvc._
import org.slf4j.LoggerFactory
object Application extends Controller {
val log = LoggerFactory.getLogger(getClass())
def index = Action {
log.trace("index")
NotFound
}
def hb = Action {
log.trace("hb")
val message = makeMessage()
log.info(message)
Ok(message)
}
def makeMessage(): String = {
val version = "@buildsig.version@"
val tag = "@buildsig.tag@"
val timestamp = "@buildsig.timestamp@"
val status = makeStatus()
return "DM2 [Version: %s] [Build: %s] [Date: %s] [Status: %s]".format(version, tag, timestamp, status)
}
def makeStatus(): String = {
// TODO: Implement datastore healthcheck
return "TODO"
}
}
对于使用SLF4J /或的logback的log4j任何开发人员,这种做法会显得陌生。 在另一方面,我目前通过努力开始shell脚本从“玩DIST”失败的JAR文件来定位logger.xml其中由启动脚本没有使用我的conf / logger.xml即得到贾里德了由“戏DIST”命令。
如果我是一个斯卡拉开发的只是一点点好,我认为同样的效果可以像一个记录特征来实现。
由于播放的记录器封装底层SLF4J调用,Logger类始终是“应用程序”:
13:45:21 INFO application: - Some message
但有一个简单的办法解决这。
创建一个特质:
import play.api.Logger
trait WithLogging {
val logger: Logger = Logger(this.getClass())
}
而在你的类只是混在他们的特性:
import WithLogging
class Foobarr extends WithLogging {
def doFoo = {
logger.info("Im in foooo")
}
}
现在,这应该是:
13:45:21 INFO models.Foobarr: - Im in foooo