所以,Grails 已经设置了由连接池支持的数据源。有没有办法在 Logback 中利用这些与 DBAppender
一起使用,这样我就不必创建单独的并行数据源/连接池?
logback.groovy
在某种程度上是 Grails 外部的,因此它不接受 Spring Autowiring ,而其他技巧如 grails.util.Holders.findApplication()
则不接受似乎有效。
最佳答案
汪汪,这真是一件苦差事。坦白说,我对 Logback 有点失望。 Logback 创建它自己的 Spring ApplicationContext。所以我们有两个不同的上下文。啊。另外,Logback 用于在 Groovy 中配置 Spring 的 DSL 与 Grails 的不同当然也无济于事。
由于 Logback 在 Grails 完全启动之前启动,因此我们需要告诉 Logback 创建一些虚拟附加程序,这些附加程序仅存储日志消息,直到我们从 Grails 内部启动附加程序为止。我们使用 Spring 的 logback 扩展来执行此操作。
build.gradle:
compile 'org.logback-extensions:logback-ext-spring:0.1.4'
logback.groovy:
import ch.qos.logback.ext.spring.DelegatingLogbackAppender
appender('DB', DelegatingLogbackAppender)
appender('STDOUT', DelegatingLogbackAppender)
resources.groovy:
import ch.qos.logback.ext.spring.ApplicationContextHolder
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.classic.db.DBAppender
import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.db.DataSourceConnectionSource
import org.slf4j.LoggerFactory
beans = {
applicationContextHolder(ApplicationContextHolder)
loggerContext(LoggerFactory) { bean ->
bean.factoryMethod = "getILoggerFactory"
}
patternLayoutEncoder(PatternLayoutEncoder) { bean ->
bean.initMethod = 'start'
bean.destroyMethod = 'stop'
context = ref(loggerContext)
pattern = "%level %logger - %msg%n"
}
STDOUT(ConsoleAppender) { bean ->
bean.initMethod = 'start'
bean.destroyMethod = 'stop'
context = ref(loggerContext)
encoder = ref(patternLayoutEncoder)
}
connectionSource(DataSourceConnectionSource) { bean ->
bean.initMethod = 'start'
bean.destroyMethod = 'stop'
context = ref(loggerContext)
dataSource = ref(dataSource)
}
DB(DBAppender) { bean ->
bean.initMethod = 'start'
bean.destroyMethod = 'stop'
context = ref(loggerContext)
connectionSource = ref(connectionSource)
}
}
DataSourceConnectionSource
中的 ref(dataSource)
引用您在 application.yml
或 application.groovy< 中配置的数据源
.
假设您有多个数据源(或者甚至配置了一个名为 dataSources.logging
的 logback)。在这种情况下,bean 引用将为 dataSource_logging
。其中的默认数据源case(称为 dataSources.dataSource
bean 引用只是 dataSource
。我花了一段时间才弄清楚这一点。
总而言之,我怀念使用 Grails DSL 在 Grails 配置文件中配置 Log4j 的日子。我知道将日志记录与 Grails 分开意味着 Graeme 和 Grails 团队要处理的事情少了一件,但对于我认为常见的事情来说,这是一个主要的 PITA。 ́\_(ツ)_/́
关于grails - 有没有办法将 Grails 数据源注入(inject) logback.groovy 以便与 DBAppender 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40364997/