2009-06-02 6 views
11

ich folgende log4j config in meinem Grails 1.1 app habenkeine log4j Ausgabe in Grails App

log4j = { 

    // Enable Hibernate SQL logging with param values 
    trace 'org.hibernate.type' 
    debug 'org.hibernate.SQL' 

    debug 'com.mycompany' 

    appenders { 
     console name: 'stdout', layout: pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n') 
     file name: 'hibeFile', file: 'hibe.log', layout: pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n') 
    } 

    // By default, messages are logged at the error level to both the console and hibe.log 
    root { 
     error 'stdout', 'hibeFile' 
     additivity = true 
    } 
} 

Wenn ich Unit-Tests laufen, die nur aus den Hibernate-Klassen erzeugt Protokollierung ausgegeben wird. Ich verstehe nicht, warum für meine eigenen Klassen, d. H. Diejenigen unter dem com.mycompany Namensraum, keine Protokollierungsausgabe erzeugt wird. Seltsamerweise, wenn ich Integrationstests ausführe, ist die log4j-Ausgabe wie erwartet.

Wenn ich für einen Komponententest zum Testbericht gehen, und klicken Sie auf „System.out“ -Link, sehe ich meine Log-Meldungen in folgendem Format:

DEBUG (member.InviteServiceTests): Calling getInvite with member (4517) 

Beachten Sie, dass dies nicht der ist das gleiche Muster wie das, das ich in meiner log4j-Konfiguration angegeben habe. Außerdem, wenn ich die log4j config ändern:

debug 'com.mycompany' 

zu:

fatal 'com.mycompany' 

ich log sehe immer noch Meldungen an der Debug-Level im Prüfbericht. Es scheint, als ob der Root-Logger beim Ausführen von Komponententests überschrieben wird. Ich habe versucht, Klassen-Protokollierung unter com.mycompany einen separaten Logger verwenden, aber das scheint keinen Unterschied

Danke, Don

Antwort

17

Don,

Wenn die Klassen, die Sie zu protokollieren versuchen, sind Standard Grails Klassen (Domain, Controller, Service etc.), sollten Sie in der Lage sein, etwas zu verwenden wie:

log4j = { 

    // Logging warnings and higher for all of the app 
    warn 'grails.app' 
    // Logging infos and higher for all controllers 
    info 'grails.app.controller' 
    // Logging debug and higher for the BarService 
    debug 'grails.app.service.BarService' 

    appenders { 
    // ...as above... 
    }  
    root { 
    // ...as above... 
    } 
} 

Es ist etwas Beschreibung an der Grails Bedienungsanleitung section on logging.

-1

Don,

Ich habe ganz geknackt nicht zu machen, die Feinheiten der Logging DSL in 1.1, aber das könnte für Sie nützlich sein: Dynamic Logging Plugin ermöglicht es Ihnen, Logging-Kanäle ein-/auszuschalten, während Ihre App läuft, und erzeugt auch einige Config, die Sie dann in Conf.groovy setzen können.

Hoffe, das hilft.

9

Da grails logs auf log4j protokolliert, können Sie -Dlog4j.debug verwenden und sehen, wie log4j konfiguriert ist (reference). Vielleicht wird eine andere Datei abgeholt.


Es gibt mindestens einen critical bug fix für die Protokollierung, die bei 1.2 ausgerichtet ist, aber nicht auf 1.1.x Die Konfiguration ist ähnlich wie bei Ihnen. Vielleicht werden die Nachrichten fälschlicherweise in einer anderen Datei protokolliert?

0

Sie benötigen einen Logger in Ihrem Controller in einem Unit-Test zu injizieren:

mockLogging(<controller class name>, true) 

Das zweite Argument besagt, Debug-Meldungen und unten zu protokollieren.