How do I configure Logback to print out the class

2019-07-21 03:08发布

我使用的播放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级了我想要的东西,但似乎没有一个可行的方法来生成日志。

如何将其配置为输出应用特定的类和方法,而不是类和记录器本身的方法是什么?

Answer 1:

的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]是线程名

  • cfswsiexample是软件包名

  • ExServiceImpl是类名

  • getStatus是方法名

  • 993是行号



Answer 2:

%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


Answer 3:

旧线,但共同的问题。 Play使用SLF4J周围的包装,这将导致被记录为[记录仪$ ALogger]或[应用]一切。 有记录实际的类名称的几种方法。

把这个在你的类:

private static org.slf4j.Logger logger = play.logger.underlying();

并把这个在你的方法:

logger.info("Your message");

另一种选择是,以取代所有的记录器的调用与此,但它会增加开销,因为它要记录的东西,每次来获取潜在的对象:

Logger.underlying().info("Your message");


Answer 4:

我不知道,这真的是你想要什么,但你试试这个? :

记录仪(this.getClass())。信息( “getTickets”)



Answer 5:

我在放弃该游戏似乎默认为与它记录仪单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”命令。

如果我是一个斯卡拉开发的只是一点点好,我认为同样的效果可以像一个记录特征来实现。



Answer 6:

由于播放的记录器封装底层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


文章来源: How do I configure Logback to print out the class name