Grails 2.1.1 - Logback集成

时间:2012-12-03 14:15:01

标签: grails logback

我正在使用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-log4jslf4j-api

grails.project.dependency.resolution = {
  // inherit Grails' default dependencies
  inherits("global") {
      excludes "grails-plugin-log4j", "slf4j-api"
  }
  ...
}

我尝试在slf4j-api 1.6.6 compilebuild以及其他必要的库中加载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 compilegrails 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的经验,可以就此问题给我任何建议吗?

1 个答案:

答案 0 :(得分:1)

我认为对于愿意用Grails实现Logback Logging Framework的其他开发人员来说这个问题也是事实,我将在这个答案中分享我在这个主题上的进展 - 尽量不要超过最初的问题进度信息。

  1. 我仍然没有在Grails中更新 slf4j 的运气,所以我卡住了 用解决方案简单地重载slf4j-api依赖。 Grails在grails dependency-report上没有显示错误,只是一个 关于较旧的slf4j依赖关系的“驱逐通知”(1.6.2)。这似乎 工作,但我会继续寻找更好的解决方案 主题。

  2. 我现在能够加载外部配置文件以进行Logback ServletContextListenerConfigLoader类 在grails-app/src/java中实现了 ServletContextListenerweb.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获取了这些类 来自hereLogbackConfigurer课程,并调整它们以适应 我的需要。

    现在一切都像魅力一样,我能够创建一个外部配置文件 - 我最喜欢的 - 它是挂钩的 使用注入例如log的{​​{1}}对象Controller个班级 默认情况下。

  3. 希望这也是对其他开发者的帮助;)

    如果您有更好或更“常规”的解决方案,请告诉我!