【发布时间】:2015-03-29 06:28:26
【问题描述】:
Grails 3 使用logback 作为默认的日志系统。
我需要一个示例,说明如何以这种形式在 grails 3 中使用 logback
log.info("some Info")
【问题讨论】:
Grails 3 使用logback 作为默认的日志系统。
我需要一个示例,说明如何以这种形式在 grails 3 中使用 logback
log.info("some Info")
【问题讨论】:
您必须将记录器配置的第四个参数设置为false:
logger('grails.app.controllers', INFO, ['STDOUT'], false)
那么日志不会显示两次。
我认为这是因为 root 记录器也捕获了 INFO。
【讨论】:
['STDOUT'] 部分,则不必添加“假”(即加法标志)。您会得到重复的日志记录,因为(没有错误),您告诉 logback 通过根记录器(到 STDOUT)和通过这个特定的记录器追加。删除 STDOUT 意味着它只会通过根记录器附加。有关可加性标志的说明,请参阅 the documentation。
if ((Environment.isDevelopmentMode() || Environment.currentEnvironment == Environment.TEST) ...) { ...
我只是在研究这个,因为我有类似的类似问题。 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。
【讨论】:
我试过这样,效果很好。这是来自petclinic 示例。
更多详情,请访问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 )
}
}
【讨论】:
在 Grails 3 中也需要这个。找到 mrhaki 的这篇文章:
我在 Quartz 工作中对此进行了测试。我在logback.groovy中添加了以下行
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
有趣的事情正在发生。我看到每个 log.info 有 2 条重复行
log.info "test"
log.info "test2"
System.out.println("test"3)
给我:
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
【讨论】:
false 添加到logger("grails.app.jobs", INFO, ['STDOUT'], false) 将删除重复的日志条目。