我正在使用Play 2.1。我正在使用默认记录器play.api.Logger。我对它是如何工作感到困惑。
在我的scala代码中,方法“getPayment()”中的类“com.myapp.tickets”中的一行像这样
Logger.info("getTickets")
生成这样的日志消息。
14:58:58.005 INFO application play.api.LoggerLike$class info getTickets
我的application-logger.xml模式是
%d{HH:mm:ss.SSS} %-5level %logger %class %method %msg%n
我遇到的问题是%logger告诉我“应用程序”,%class告诉我“play.api.LoggerLike $ class和%method告诉我”信息“。我知道所有这些。我当然想避免在消息本身中添加更多信息(如类名或方法)。
如果我打印出调用堆栈(%调用者),那么第2级就有了我想要的东西,但这似乎不是生成日志的可行方法。
如何配置它以输出特定于应用程序的类和方法,而不是输出记录器本身的类和方法?
答案 0 :(得分:22)
%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
答案 1 :(得分:10)
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
[http-bio-8080-exec-3]
是主题名称
c.f.s.w.s.i.example
是包名称
ExServiceImpl
是班级名称
getStatus
是方法名称
993
是行号
答案 2 :(得分:4)
旧线程,但常见问题。 Play使用slf4j周围的包装器,这会导致所有内容记录为[Logger $ ALogger]或[application]。有几种方法可以记录实际的类名。
把它放在你的班级中:
private static org.slf4j.Logger logger = play.logger.underlying();
并将其放入您的方法中:
logger.info("Your message");
另一种选择是用这个替换所有的Logger调用,但是它会增加开销,因为每次你想记录某些事情时它都必须获取底层对象:
Logger.underlying().info("Your message");
答案 3 :(得分:1)
我不确定它真的是你想要的,但你试试这个吗? :
记录器(this.getClass())。信息( “getTickets”)
答案 4 :(得分:0)
我正在放弃Play似乎默认使用其Logger的单一application.log方法。我的应用程序需要对它进行细粒度的日志记录和运行时调整,以便在classname == 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的开发人员来说,这种方法似乎很熟悉。另一方面,我目前正在努力通过start shell script from "play dist" fails to locate logger.xml in JAR file,在那里,启动脚本无法使用我的conf / logger.xml,它通过“play dist”命令获得JARed。
如果我对Scala开发人员稍微好一点,我认为使用Logging特性可以达到同样的效果。
答案 5 :(得分:0)
由于Play的Logger包装了底层的SLF4J调用,因此记录器类始终是" application":
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