2013-03-06 12 views
10

Sto utilizzando Play 2.1. Sto usando il logger predefinito play.api.Logger. Sono confuso su come funziona.Come configurare Logback per stampare il nome della classe

Nel mio codice Scala, una linea in classe "com.myapp.tickets" nel metodo "getPayment()" come questo

Logger.info("getTickets") 

genera un messaggio di log come questo.

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

mio schema di applicazione-logger.xml è

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

Il problema che ho è che% logger mi dice "applicazione", classe% mi dice "play.api.LoggerLike $ classe% metodo mi dice "info" .Sapito tutto questo, ovviamente voglio evitare di aggiungere altro cruft nel messaggio stesso (come il nome della classe o il metodo)

Se stampo lo stack di chiamate (% chiamante) quindi il livello 2 ha quello che voglio, ma non sembra un modo praticabile per generare un log.

Come si configura per l'output della classe e del metodo specifici dell'applicazione, non della classe e del metodo stesso del logger?

risposta

4

Logback:

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

risultati:

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] è il nome del thread

  • c.f.s.w.s.i.example è il nome del pacchetto

  • ExServiceImpl è il nome della classe

  • getStatus è il nome del metodo

  • 993 è il numero di riga

+2

Questo non risolve il problema originale, dal momento che questo mostra ancora lo stesso cruft "play.api.LoggerLike $ class". –

+0

La stessa cosa, non aiuta. 'play.api.LoggerLike $ class' viene visualizzato. '% logger' visualizza il cluster corretto – Sergey

1

Non sono sicuro che sia davvero quello che vuoi ma ci provi? :.

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

+1

Questo è vicino, ma non è esattamente quello Stavo cercando. Ho questo 06: 24: 52.907 INFO com.myapp.tickets $ play.api.LoggerLike $ informazioni classe getTickets Quindi il logger% ottiene la stringa corretta con cui sto bene. Questo è un miglioramento. Ma il metodo% class e% sta ancora recuperando i valori inutili dal gioco. Dato che il registratore% ha la classe corretta, la classe% non è così importante e può essere eliminata. Il metodo% è ciò che manca ancora. C'è un modo per ottenere il vero metodo "getPayments" invece di "info"? – user2141729

18

%class{0} sarà solo in uscita il nome della classe, così invece di:

com.something.MyClass 

Otterrete:

MyClass 

Ecco come il mio modello per logback appare normalmente:

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

è anche possibile aggiungere il metodo e la linea, se siete interessati facendo:

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

Sono in procinto di abbandonare l'unico approccio application.log che giocano sembra default con il suo Logger. La mia applicazione richiede il tipo di registrazione a grana fine e la regolazione del runtime che il logback di tipo straight-up fa così bene quando classname == Nome del logger. Ho avuto abbastanza buon successo di andare solo "vecchia scuola" nei miei controller come ...

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

per qualsiasi sviluppatore usato per SLF4J/logback o log4j, questo approccio vi sembrerà familiare. D'altra parte, sto attualmente lottando attraverso lo start shell script from "play dist" fails to locate logger.xml in JAR file, dove dallo script di avvio non riesco a usare il mio conf/logger.xml che diventa JARed dal comando "play dist".

Se fossi un po 'meglio di uno sviluppatore Scala, penso che lo stesso effetto si possa ottenere con qualcosa come un tratto di log.Reticolo

4

thread vecchio, ma problema comune. Play utilizza un wrapper attorno a slf4j, che fa sì che tutto venga registrato come [Logger $ ALogger] o [applicazione]. Esistono alcuni modi per registrare il nome effettivo della classe.

Mettere questo nella tua classe:

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

e mettere questo nei vostri metodi:

logger.info("Your message"); 

Un'altra opzione è quella di sostituire tutti i tuoi Logger chiamate con questo, ma aggiungerà in testa dal deve recuperare l'oggetto sottostante ogni volta che si desidera registrare qualcosa:

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

Infine, qualcosa che ha funzionato. Non c'è modo di farlo direttamente dal gioco? – saurabheights

0

Dal Pla di y Logger avvolge le chiamate SLF4J sottostanti, la classe logger è sempre "applicazione":

13:45:21 INFO application: - Some message 

Ma c'è un modo semplice intorno a questo.

Creare un tratto:

import play.api.Logger 

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

E nelle classi giusto mix nel tratto:

import WithLogging 

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

Ora questo dovrebbe essere:

13:45:21 INFO models.Foobarr: - Im in foooo 
Problemi correlati