Как настроить Logback для распечатки имени класса
Я использую Play 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
Мой шаблон application-logger.xml
%d{HH:mm:ss.SSS} %-5level %logger %class %method %msg%n
У меня проблема в том, что%logger говорит мне "application", %class говорит мне "play.api.LoggerLike$class, а метод% говорит мне" info ". Я знаю все это. Я, конечно же, хочу избежать добавления лишних слов в само сообщение (например, имя класса или метод).
Если я распечатываю стек вызовов (%caller), то уровень 2 имеет то, что я хочу, но это не кажется приемлемым способом создания журнала.
Как мне настроить его для вывода класса и метода приложения, а не класса и метода самого регистратора?
6 ответов
Шаблон выхода из системы:
%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] или [application]. Есть несколько способов записать фактическое имя класса.
Поместите это в свой класс:
private static org.slf4j.Logger logger = play.logger.underlying();
И поместите это в свои методы:
logger.info("Your message");
Другой вариант - заменить все ваши вызовы Logger этим, но это добавит накладных расходов, так как он должен извлекать базовый объект каждый раз, когда вы хотите что-то записать:
Logger.underlying().info("Your message");
Я не уверен, что это действительно то, что вы хотите, но вы пробуете это?:
Logger (this.getClass ()). Информация ("getTickets")
Я нахожусь в процессе отказа от единого подхода application.log, который, по-видимому, используется по умолчанию с его Logger. Мое приложение требует своего рода мелкозернистого ведения журнала и его настройки во время выполнения, чтобы прямой возврат был успешен, когда 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" не может найти файл logger.xml в файле JAR, где сценарий запуска не может использовать мой файл conf/logger.xml, который запускается JAR при помощи "play" dist "команда.
Если бы я был немного лучше разработчика Scala, я думаю, что тот же эффект может быть достигнут с помощью чего-то вроде черты Logging.
Поскольку Play's Logger оборачивает базовые вызовы SLF4J, классом logger всегда является "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