2013-03-06 3 views
10

Я использую Play 2.1. Я использую logger play.api.Logger по умолчанию. Я смущен тем, как это работает.Как настроить Logback для печати имени класса

В моем коде лестницы, строка в классе «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 $ класс и% метод говорит мне «info». Я знаю все это. Я, конечно же, хочу не добавлять больше сообщений в само сообщение (например, имя класса или метод).

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

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

ответ

4

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

На самом деле это не проблема исходной проблемы, так как в ней все еще отображается один и тот же «play.api.LoggerLike $ class» cruft. –

+0

То же самое, это не помогает. Отображается 'play.api.LoggerLike $ class'. '% logger' отображает правильный кластер – Sergey

1

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

Logger (this.getClass()) Информация ("getTickets")

+1

Это близко, но не совсем то, что Я искал. Я получаю это 06: 24: 52.907 INFO com.myapp.tickets $ play.api.LoggerLike $ class info getTickets Так что% logger получает правильную строку, с которой я в порядке. Это улучшение. Но метод% class и% все еще получает бесполезные значения от игры. Учитывая, что% logger имеет соответствующий класс, класс% не так важен и его можно отбросить. Метод% все еще отсутствует. Есть ли способ получить реальный метод «getPayments» вместо «info»? – user2141729

18

%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 
0

Я нахожусь в процессе отказа от единого application.log подхода, Play, кажется, по умолчанию с 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 = "@[email protected]" 
    val tag = "@[email protected]" 
    val timestamp = "@[email protected]" 
    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, который получает JARed командой «play dist».

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

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"); 
+0

Наконец-то, что сработало. Нет ли способа сделать это прямо из игры? – saurabheights

0

Начиная с Pla Logger значений у упаковывает основные вызовы 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 
Смежные вопросы