grails - 有没有办法将 Grails 数据源注入(inject) logback.groovy 以便与 DBAppender 一起使用?

标签 grails logback logback-groovy grails3

所以,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.ymlapplication.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/

相关文章:

grails - 如何替换gsp中的编码?

mysql - 如何使用 Grails 2.0 获得可为空的约束?

session - 获取grails计划魔术保存的所有对象的列表

java - Logback 不会关闭 dbappender 的数据源连接

groovy - Spring Boot + Groovy + logback.groovy

grails - 如何在 grails 约束中设置固定长度的字符串?

java - Logback 和 SLF4J 编程配置

Grails 3 : External Logback. 常规文件

java - 将 logback classic 与 gradle 结合使用时无法加载 logback 配置