有没有办法将 Grails 数据源注入 logback.groovy 以与 DBAppender 一起使用?
Is there a way to inject a Grails datasource into logback.groovy for use with DBAppender?
因此,Grails 已经设置了由连接池支持的数据源。有没有办法在 Logback 中利用这些与 DBAppender
一起使用,这样我就不必创建单独的并行 datasource/connection 池?
logback.groovy
在某种程度上是 Grails 外部的,因此它不接受 Spring 自动装配,并且 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
中配置的dataSource。
假设您有多个数据源(或者甚至是一个名为 dataSources.logging
的 logback 配置。在这种情况下,bean 引用将是 dataSource_logging
。这种情况下的默认数据源(称为 dataSources.dataSource
bean 引用只是 dataSource
。我花了一段时间才弄明白。
总而言之,我怀念使用 Grails DSL 从 Grails 配置文件中配置 Log4j 的日子。我知道将日志记录与 Grails 分开意味着 Graeme 和 Grails 团队要处理的事情少了一件,但这是一个主要的 PITA,因为我认为这很常见。 ¯\_(ツ)_/¯
因此,Grails 已经设置了由连接池支持的数据源。有没有办法在 Logback 中利用这些与 DBAppender
一起使用,这样我就不必创建单独的并行 datasource/connection 池?
logback.groovy
在某种程度上是 Grails 外部的,因此它不接受 Spring 自动装配,并且 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
中配置的dataSource。
假设您有多个数据源(或者甚至是一个名为 dataSources.logging
的 logback 配置。在这种情况下,bean 引用将是 dataSource_logging
。这种情况下的默认数据源(称为 dataSources.dataSource
bean 引用只是 dataSource
。我花了一段时间才弄明白。
总而言之,我怀念使用 Grails DSL 从 Grails 配置文件中配置 Log4j 的日子。我知道将日志记录与 Grails 分开意味着 Graeme 和 Grails 团队要处理的事情少了一件,但这是一个主要的 PITA,因为我认为这很常见。 ¯\_(ツ)_/¯