Grails 3使用logback
作为默认的日志记录系统。
我需要一个例子,说明如何在这种形式的grails 3中使用logback
log.info("some Info")
您必须将logger配置的第四个参数设置为false
:
logger('grails.app.controllers', INFO, ['STDOUT'], false)
然后日志记录不会显示两次。
我认为那是因为root
记录器也捕获了INFO
。
我只是在研究这个,因为我有类似的问题。 Grails 3确实使用Logback进行日志记录配置,但AST转换仍然使用Apache Commons Logging。
然后它使用jcl-over-slf4j桥将它全部映射回Logback。
根据邮件列表http://grails.1312388.n4.nabble.com/Grails-2-1-1-Is-it-possible-to-replace-the-injected-log-object-td4638834.html,要在全局范围内替换注入的log
,您必须排除日志记录依赖项并将AST Transformer替换为您自己的。
上面评论中的博客文章提到的Logback插件提供了这个:https://github.com/grails-plugins/grails-logback/blob/master/src/java/org/codehaus/groovy/grails/compiler/logging/Slf4jTransformer.java。但是,它似乎有很多冗余,因为Grails 3已经拥有Logback支持。
如果您不想通过该工作来更改日志注入,则可以通过使用@Slf4j
对类进行批注来覆盖记录器,这将覆盖该类的记录器。
import org.slf4j.Logger
import org.slf4j.LoggerFactory
static Logger log = LoggerFactory.getLogger(SomeClass.class)
这有效,但我也想知道grails 3是否可以自动注入log
。
在Grails 3中也需要这个。发现mrhaki的这篇文章:
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 )
}
}
我在Quartz工作上测试了这个。我在grails 3 logging中添加了以下行
logback.groovy
在quartz工作中使用测试日志:
logger("grails.app.jobs", INFO, ['STDOUT'])
在控制台中显示日志信息
log.info "test " + new Date()
有趣的事情正在发生。我看到每个INFO grails.app.jobs.myapp.TestJob - test Tue Oct 20 10:07:31 CEST 2015
有2个重复的行
log.info
给我:
log.info "test"
log.info "test2"
System.out.println("test"3)