如何配置Logback以打印出类名

时间:2013-03-06 21:10:45

标签: playframework-2.0 playframework-2.1

我正在使用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级就有了我想要的东西,但这似乎不是生成日志的可行方法。

如何配置它以输出特定于应用程序的类和方法,而不是输出记录器本身的类和方法?

6 个答案:

答案 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