Есть ли способ добавить источник данных Grails в logback.groovy для использования с DBAppender?
Итак, Grails уже настраивает источники данных, поддерживаемые пулами соединений. Есть ли способ использовать те для использования с DBAppender
в Logback, так что мне не нужно создавать отдельный параллельный пул источника данных / подключения?
logback.groovy
является чем-то внешним по отношению к Grails, поэтому он не принимает Spring-электропроводку и другие приемы, такие как grails.util.Holders.findApplication()
не похоже на работу.
1 ответ
Гав, это была рутина. Честно говоря, я немного разочарован в Logback. Logback создает свой собственный Spring ApplicationContext. Таким образом, у нас есть два отдельных контекста. Тьфу. Кроме того, это, безусловно, не помогает тому, что DSL, который Logback использует для настройки Spring в Groovy, отличается от Grails.
Поскольку Logback запускается до того, как Grails полностью запустится, мы должны указать Logback создать несколько фиктивных приложений, которые будут просто хранить сообщения журнала, пока мы не запустим приложения из Grails. Мы используем расширение logback для Spring, чтобы сделать это.
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)
}
}
ref(dataSource)
в DataSourceConnectionSource
ссылается на источник данных, который вы настроили в application.yml
или же application.groovy
,
Допустим, у вас есть несколько источников данных (или даже один, настроенный только для входа в систему) dataSources.logging
, В этом случае ссылка на компонент будет dataSource_logging
, Источник данных по умолчанию в этом случае (называется dataSources.dataSource
ссылка на бин просто dataSource
, Мне понадобилось время, чтобы понять это.
В общем, я скучаю по дням настройки Log4j из файла конфигурации Grails с использованием Grails DSL. Я понимаю, что отделение логарифмирования от Grails означает, что Graeme и команда Grails должны иметь дело с чем-то меньшим, но это была главная PITA для чего-то, что, по моему мнению, будет распространено. ¯\_(ツ)_/¯