Как настроить Logback для печати имени класса

Я использую Play 2.1. Я использую игру logger по умолчанию.прикладной программный интерфейс.Лесоруб. Я не понимаю, как это работает.

в моем коде scala строка в классе " com.приложение myapp.билеты "в методе" getPayment () " вот так

Logger.info("getTickets")

выдает такое сообщение журнала.

14:58:58.005 INFO  application play.api.LoggerLike$class info  getTickets

Мои приложения-регистратор.шаблон xml-это

%d{HH:mm:ss.SSS} %-5level %logger %class %method  %msg%n

проблема в том, что %logger говорит мне "приложение", %class говорит мне "играть".прикладной программный интерфейс.LoggerLike$class и %метод говорит мне "информация." Я все это знаю. Я, конечно, хочу избежать добавления большего cruft в само сообщение (например, имя класса или метод).

Если я распечатаю стек вызовов (%caller), то уровень 2 имеет то, что я хочу, но это не кажется жизнеспособным способом создания журнала.

как настроить его для вывода определенного класса и метода приложения, а не класса и метода самого регистратора?

6 ответов


шаблон 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 - это номер строки


%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, которая заставляет все регистрироваться как [Logger$ALogger] или [приложение]. Существует несколько способов регистрации фактического имени класса.

положить это в свой класс:

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

и поместите это в свои методы:

logger.info("Your message");

другой вариант-заменить все ваши вызовы Logger этим, но он добавит накладные расходы, так как он должен получать базовый объект каждый раз, когда вы хотите войти что-то:

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

Я не уверен, что это действительно то, что вы хотите, но вы попробовать это? :

регистратор (это.getClass ()).info ("getTickets")


Я в процессе отказа от одного приложения.подход журнала, который играет, кажется, по умолчанию с его регистратором. Мое приложение требует тонкого ведения журнала и настройки времени выполнения, что прямой logback делает так хорошо, когда classname == Logger name. У меня был довольно хороший успех, просто "старая школа" в моих контроллерах...

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, этот подход покажется знакомым. С другой стороны, я в настоящее время борется через запустить сценарий оболочки из "play dist" не удается найти регистратор.XML-файл в jar-файл где по сценарию запуска не удается использовать мой conf / logger.xml, который получает Джаред с помощью команды "play dist".

Если бы я был немного лучше разработчика Scala, я думаю, что тот же эффект может быть достигнут с чем-то вроде черты ведения журнала.


поскольку регистратор Play обертывает базовые вызовы SLF4J, класс регистратора всегда является "приложением":

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