そのため、Grails は、接続プールによってサポートされるデータソースを既にセットアップしています。DBAppender
別の並列データソース/接続プールを作成する必要がないように、Logbackで使用するためにそれらを活用する方法はありますか?
logback.groovy
は Grails の外部にあるため、Spring の自動配線を受け入れず、その他のトリックは機能grails.util.Holders.findApplication()
しないようです。
そのため、Grails は、接続プールによってサポートされるデータソースを既にセットアップしています。DBAppender
別の並列データソース/接続プールを作成する必要がないように、Logbackで使用するためにそれらを活用する方法はありますか?
logback.groovy
は Grails の外部にあるため、Spring の自動配線を受け入れず、その他のトリックは機能grails.util.Holders.findApplication()
しないようです。
うわー、これは雑用でした。率直に言って、私は Logback に少し幻滅しています。Logback は独自の Spring ApplicationContext を作成します。したがって、2 つの別個のコンテキストがあります。うーん。また、Groovy で Spring を構成するために Logback が使用する 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)
}
}
のref(dataSource)
は、またはDataSourceConnectionSource
で構成した dataSource を参照します。application.yml
application.groovy
複数の dataSources があるとします (または、logback と呼ばれる 1 つだけが構成されているとしdataSources.logging
ます。その場合、Bean 参照は になりますdataSource_logging
。その場合のデフォルトの dataSource ( dataSources.dataSource
bean 参照と呼ばれる) は . それを理解するのにしばらく時間がかかりdataSource
ました.
全体として、Grails DSL を使用して Grails 構成ファイル内からLog4jを構成する日々が恋しいです。ロギングを Grails から分離することで、Graeme と Grails チームが対処しなければならないことが 1 つ減ることになると思いますが、これは、私がよくあることだと思っていたことに対する主要な PITA でした。¯\_(ツ)_/¯