2015-03-29 14 views
7

Grails 3 verwendet Logback als Protokollierungssystem.Logback in Grails verwenden 3

brauche ich ein Beispiel dafür, wie in Grails 3 in dieser Form verwenden logback

log.info("some Info") 
+1

Sie gesehen haben? http://jdpgrailsdev.github.io/blog/2014/03/24/grails_logback.html – dsharew

Antwort

2
import org.slf4j.Logger 
import org.slf4j.LoggerFactory 

static Logger log = LoggerFactory.getLogger(SomeClass.class) 

Das funktioniert aber ich frage mich auch, wenn grails 3 auto log injizieren kann.

4

Ich habe gerade in das untersucht, weil ich ähnliche eine ähnliche Frage hatte. Grails 3 verwendet Logback für die Protokollierungskonfiguration, aber die AST-Transformation verwendet weiterhin Apache Commons Logging.

https://github.com/grails/grails-core/blob/master/grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.java

Es verwendet dann die JCL-over-slf4j Brücke alles wieder in alle zurück in Logback abzubilden.

Laut der Mailingliste, http://grails.1312388.n4.nabble.com/Grails-2-1-1-Is-it-possible-to-replace-the-injected-log-object-td4638834.html, um die injizierte log global zu ersetzen, müssen Sie die Protokollabhängigkeiten ausschließen und den AST Transformer durch Ihren eigenen ersetzen.

Das Logback-Plugin, das der Blog im obigen Kommentar erwähnt, bietet Folgendes: https://github.com/grails-plugins/grails-logback/blob/master/src/java/org/codehaus/groovy/grails/compiler/logging/Slf4jTransformer.java. Es scheint jedoch eine Menge Redundanz zu sein, da Grails 3 bereits über Logback-Unterstützung verfügt.

Wenn Sie die Protokollinjektion nicht ändern möchten, können Sie den Protokollierer überschreiben, indem Sie die Klasse mit @Slf4j annotieren. Dadurch wird der Protokollierer für diese Klasse überschrieben.

0

in Grails benötigt auch das 3. Beitrag von mrhaki Gefunden:

grails 3 logging

ich diese auf einem Quarz-Job getestet. Ich habe die folgende Zeile in logback.groovy

logger("grails.app.jobs", INFO, ['STDOUT']) 

Mit Testprotokoll im Quarz Job:

log.info "test " + new Date() 

zeigt log info in der Konsole

INFO grails.app.jobs.myapp.TestJob - test Tue Oct 20 10:07:31 CEST 2015 

Lustige Sache geschieht. Ich sehe zwei doppelte Zeilen für jeden log.info

log.info "test" 
log.info "test2" 
System.out.println("test"3) 

Gibt mir:

INFO grails.app.jobs.myapp.TestJob - test 
INFO grails.app.jobs.myapp.TestJob - test 
INFO grails.app.jobs.myapp.TestJob - test2 
INFO grails.app.jobs.myapp.TestJob - test2 
test3 
+1

Hinzufügen von 'false' zu' logger ("grails.app.jobs", INFO, ['STDOUT'], false) 'wird Entfernen Sie doppelte Protokolleinträge. – Guus

14

Sie haben das vierte Argument des Logger Config false zu setzen:

logger('grails.app.controllers', INFO, ['STDOUT'], false) 

dann die Protokollierung nicht zweimal angezeigt.

Ich denke, das ist, weil der root Logger INFO auch fängt.

+3

Sie müssen das 'false' (d. H. Additivitäts-Flag) nicht hinzufügen, wenn Sie auch den '['STDOUT']' -Teil entfernen. Sie erhalten eine doppelte Protokollierung, weil Sie (ohne das Falsche) angeben, dass das Logback über den Root-Logger (an STDOUT) UND über diesen spezifischen Logger angehängt werden soll. Wenn Sie STDOUT entfernen, wird es nur über den Root-Logger angehängt. Eine Erläuterung des Additivitäts-Flags finden Sie in der Dokumentation (http://logback.qos.ch/manual/architecture.html). – GreenGiant

+0

@GreenGiant's Kommentar war die Lösung für mich in Grails 3.2.1. Logging funktionierte gut für "run-app", aber nicht für "test-app". Dann bemerkte ich, dass die Root-Logger-Konfiguration speziell "dev" behandelte. Ich erweiterte nur die Logik um das 'Test' env, dann erschien die Protokollierung ohne Duplikate: 'if ((Environment.isDevelopmentMode() || Environment.currentEnvironment == Environment.TEST) ...) { .. . ' – jerryb

+0

Logback Additivity Beispiel → https://examples.javacodegeeks.com/enterprise-java/logback/logback-additivity-example/ – pinei

1

Ich versuchte es so und es funktioniert gut. Dies ist von petclinic Beispiel.

Weitere Details avalable bei logback docs

import grails.util.BuildSettings 
import grails.util.Environment 


appender('STDOUT', ConsoleAppender) { 
    encoder(PatternLayoutEncoder) { 
     pattern = "%level %logger - %msg%n" 
    } 
} 

root(ERROR, ['STDOUT']) 

if(Environment.current == Environment.DEVELOPMENT) { 
    def targetDir = BuildSettings.TARGET_DIR 
    if(targetDir) { 

     appender("FULL_STACKTRACE", FileAppender) { 

      file = "${targetDir}/stacktrace.log" 
      append = true 
      encoder(PatternLayoutEncoder) { 
       pattern = "%level %logger - %msg%n" 
      } 
     } 
     logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false) 
    } 
} 
+0

Ich bin auf ein Problem gestoßen, das mich diesen Code in Frage gestellt hat: haben Sie diese Daten bestätigt geht tatsächlich in die Datei stacktrace.log? Es sieht möglicherweise so aus, als ob es funktioniert, da Stacktraces stdout treffen, aber ich habe die Erfahrung gemacht, dass es die Datei stacktrace.log nicht wirklich trifft. Also versuche ich herauszufinden, ob es nur ich ist oder ob das ein Problem mit fast allen Beispielen im Internet ist. –

+0

Siehe [diese Frage] (http://stackoverflow.com/questions/36723285/why-does-stacktrace-log-not-fill-with-logback-in-grils--3) - es scheint, dass dies nicht protokolliert wird in die Datei stacktrace.log. –