2013-03-06 11 views
10

Używam wersji 2.1. Używam domyślnego programu rejestrującego play.api.Logger. Jestem zdezorientowany, jak to działa.Jak skonfigurować funkcję Logback, aby wydrukować nazwę klasy

W moim kodu Scala, linia w swojej klasie „com.myapp.tickets” w metodzie „getPayment()” jak to

Logger.info("getTickets") 

generuje komunikat dziennika takiego.

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

Moja aplikacja-logger.xml wzór jest

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

Problem mam to, że rejestrator% mówi mi "Aplikacja" % Klasa mówi mi „play.api.LoggerLike $ class i% Metoda mówi mi "info" Wiem o tym wszystkim, oczywiście chcę uniknąć dodania większej ilości informacji do samej wiadomości (takiej jak nazwa lub metoda klasy)

Jeśli wydrukuję stos połączeń (% rozmówcy) wtedy poziom 2 ma to, czego chcę, ale to nie wydaje się być dobrym sposobem na wygenerowanie dziennika.

Jak skonfigurować tak, aby wyprowadzała specyficzną dla aplikacji klasę i metodę, a nie klasę i metodę samego rejestratora?

Odpowiedz

4

Logback Wzór:

%d{HH:mm:ss.SSS} [%thread] %-5level %class{36}.%M %L - %msg%n 

Wynik:

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] jest nazwą gwint

  • c.f.s.w.s.i.example nazwę pakietu

  • ExServiceImpl to nazwa klasy

  • getStatus to nazwie metody

  • 993 jest numer linii

+2

To naprawdę nie rozwiązuje pierwotnego problemu, ponieważ nadal wyświetla to samo "cruft" play.api.LoggerLike $ class ". –

+0

To samo nie pomaga. Wyświetli się 'play.api.LoggerLike $ class'. '% logger' wyświetla prawidłowy klaster – Sergey

1

Nie jestem pewien, czy to naprawdę jest to, czego chcesz, ale czy próbujesz tego? :.

Logger (this.getClass()) info ("getTickets")

+1

To jest blisko, ale nie dokładnie to, co Szukałem. Dostaję to 06: 24: 52.907 INFO com.myapp.tickets $ play.api.LoggerLiczka $ class info getTickets %% rejestratora otrzymuje poprawny łańcuch, z którym jestem w porządku. To jest poprawa. Jednak metoda% class i% nadal pobiera nieprzydatne wartości z gry. Biorąc pod uwagę, że% program rejestrujący ma odpowiednią klasę, klasa% nie jest tak ważna i może zostać usunięta. Brakuje jeszcze metody%. Czy istnieje sposób na uzyskanie prawdziwej metody "getPayments" zamiast "info"? – user2141729

18

%class{0} wyjście będzie tylko nazwa klasy, więc zamiast:

com.something.MyClass 

Dostaniesz:

MyClass 

ten sposób mój wzór logback wygląda normalnie:

%d{HH:mm:ss} [%thread] %-5p %class{0} - %m%n 

Można również dodać metody i linii, jeśli jesteś zainteresowany, wykonując:

%d{HH:mm:ss} [%thread] %-5p %class{0}.%method:%L - %m%n 
0

Jestem w trakcie zaniechania jednego application.log podejście, które odgrywają wydaje się domyślnie z rejestratora. Moja aplikacja wymaga rodzaju drobnoziarnistego rejestrowania i korekty środowiska wykonawczego, które sprawia, że ​​proste logback robi tak dobrze, gdy classname == Logger name. Miałem dość duży sukces dzieje tylko „starą szkołę” w moich kontrolerami jak ...

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" 
    } 
} 

Dla każdego dewelopera używane do slf4j/logback lub log4j, takie podejście może wydawać się znajome. Z drugiej strony, obecnie walczę poprzez start shell script from "play dist" fails to locate logger.xml in JAR file, gdzie skryptem startowym nie jest użycie mojego pliku conf/logger.xml, który pobiera JARed przez polecenie "play dist".

Gdybym był trochę lepszy od programisty Scala, myślę, że ten sam efekt można osiągnąć za pomocą funkcji Logging.

4

stary wątek, ale częstym problemem. Play używa opakowania wokół slf4j, co powoduje, że wszystko jest logowane jako [Logger $ ALogger] lub [application]. Istnieje kilka sposobów rejestrowania rzeczywistej nazwy klasy.

umieścić to w swojej klasie:

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

I umieścić to w twoich metod:

logger.info("Your message"); 

Inną opcją jest zastąpienie wszystkich rejestratora zwraca się z tym, ale doda napowietrznych od musi pobierać ukryty obiekt za każdym razem, gdy chcesz coś zarejestrować:

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

Wreszcie coś, co zadziałało. Czy nie ma możliwości zrobienia tego bezpośrednio z gry? – saurabheights

0

Od śliw y's Logger opakowuje podstawowe wywołania SLF4J, klasa rejestratora jest zawsze "aplikacją":

13:45:21 INFO application: - Some message 

Ale jest na to łatwy sposób.

Stwórz cechę:

import play.api.Logger 

trait WithLogging { 
    val logger: Logger = Logger(this.getClass()) 
} 

A w klasach tylko mieszać w cechy:

import WithLogging 

class Foobarr extends WithLogging { 
    def doFoo = { 
     logger.info("Im in foooo") 
    } 
} 

Teraz powinno być:

13:45:21 INFO models.Foobarr: - Im in foooo 
Powiązane problemy