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")
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")
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.
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.
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.
in Grails benötigt auch das 3. Beitrag von mrhaki Gefunden:
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
Hinzufügen von 'false' zu' logger ("grails.app.jobs", INFO, ['STDOUT'], false) 'wird Entfernen Sie doppelte Protokolleinträge. – Guus
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.
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
@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
Logback Additivity Beispiel → https://examples.javacodegeeks.com/enterprise-java/logback/logback-additivity-example/ – pinei
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)
}
}
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. –
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. –
Sie gesehen haben? http://jdpgrailsdev.github.io/blog/2014/03/24/grails_logback.html – dsharew