我正在使用Grails 2.1.1进行开发,现在我想将Logback(http://logback.qos.ch)集成为默认的日志记录框架,因为它应该提供一些更好的日志记录功能,也可以通过Groovy进行配置
由于Logback 1.0.7(最新版)仅适用于slf4j 1.6.6
我想升级Grails依赖项。 Grails 2.1.1正在使用slf4j 1.6.2
。如何正确地做到这一点?
我尝试了以下操作:在BuildConfig.groovy
我排除了grails-plugin-log4j
和slf4j-api
grails.project.dependency.resolution = {
// inherit Grails' default dependencies
inherits("global") {
excludes "grails-plugin-log4j", "slf4j-api"
}
...
}
我尝试在slf4j-api 1.6.6
compile
和build
以及其他必要的库中加载runtime
grails.project.dependency.resolution = {
...
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
compile "org.slf4j:slf4j-api:1.6.6"
build "org.slf4j:slf4j-api:1.6.6",
"ch.qos.logback:logback-core:1.0.7",
"ch.qos.logback:logback-classic:1.0.7"
runtime "org.slf4j:slf4j-api:1.6.6",
"org.slf4j:log4j-over-slf4j:1.6.6", // logback dependency for classic module, as seen on http://logback.qos.ch/dependencies.html
"ch.qos.logback:logback-core:1.0.7",
"ch.qos.logback:logback-classic:1.0.7"
}
...
}
现在,如果我想从Grails命令行执行任何操作,grails compile
或grails clean
,它会抱怨它无法执行脚本,因为它无法找到LoggerFactory类:< / p>
| Loading Grails 2.1.1
| Configuring classpath
| Error Error executing script Compile: org/slf4j/LoggerFactory (NOTE: Stack trace has been filtered. Use --verbose to see entire trace.)
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156)
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:272)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.<clinit>(PathMatchingResourcePatternResolver.java:169)
| Error Error executing script Compile: org/slf4j/LoggerFactory
如何正确升级基础slf4j-api
?
如果我不首先排除slf4j-api
,那么在拨打grails dependency-report
时,我会与标记为被驱逐的“旧”1.6.2 api发生冲突...
另外,我很想拥有一个用于Logback的外部配置文件。我该如何实现它?使用Log4j,我刚刚在log4jConfigurer
文件中声明了一个conf/spring/resources.groovy
bean - 如何使用Logback完成?
有没有人使用Logback记录Grails 2.1.1的经验,可以就此问题给我任何建议吗?
答案 0 :(得分:1)
我认为对于愿意用Grails实现Logback Logging Framework的其他开发人员来说这个问题也是事实,我将在这个答案中分享我在这个主题上的进展 - 尽量不要超过最初的问题进度信息。
我仍然没有在Grails中更新 slf4j 的运气,所以我卡住了
用解决方案简单地重载slf4j-api依赖。
Grails在grails dependency-report
上没有显示错误,只是一个
关于较旧的slf4j依赖关系的“驱逐通知”(1.6.2)。这似乎
工作,但我会继续寻找更好的解决方案
主题。
我现在能够加载外部配置文件以进行Logback
ServletContextListener
和ConfigLoader
类
在grails-app/src/java
中实现了
ServletContextListener
在web.xml
文件中注册。 (至
得到web.xml
只需执行grails install-templates
即可
命令行。你会发现它
grails-app/src/templates/war/web.xml
)一定要把它作为第一个
<listener/>
中的web.xml
条目,以便Logback获取
尽快配置和加载。
我发现这个解决方案以及完整的代码示例
https://bowerstudios.com/node/896这是最好和最短的
我在这个主题上找到的例子似乎有效!
此解决方案只是加载了外部配置文件并使用了
它在ConfigLoader
类中,但没有为整体设置它
Grails应用程序。所以我用Google搜索了一下,然后我发现了一个
来自Logback的解决方案,可从GitHub(https://github.com/qos-ch/logback-extensions)获得,并与
Spring Framework
,所以我从这个page获取了这些类
来自here的LogbackConfigurer
课程,并调整它们以适应
我的需要。
现在一切都像魅力一样,我能够创建一个外部配置文件 - 我最喜欢的 - 它是挂钩的
使用注入例如log
的{{1}}对象Controller
个班级
默认情况下。
希望这也是对其他开发者的帮助;)
如果您有更好或更“常规”的解决方案,请告诉我!