1

我正在使用 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加载compile buildruntime

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 类:

| 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一个,我会与调用时标记为驱逐的“旧”1.6.2 api 发生冲突grails dependency-report......

另外,我希望有一个用于 Logback 的外部配置文件。我将如何实施它?使用 Log4j,我只是log4jConfigurer在文件中声明了一个 bean conf/spring/resources.groovy- 如何使用 Logback 完成?

有没有人用 Logback 记录 Grails 2.1.1 的经验,可以给我任何关于这个问题的建议吗?

4

1 回答 1

1

因为我认为这个问题对于愿意使用 Grails 实现 Logback 日志框架的其他开发人员来说也是一个事实,所以我将在这个答案中分享我在这个主题上的进展——尽量不要用进度信息使初始问题过载。

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

  2. 我现在可以通过 一个 和一个在 中实现的类为 Logback 加载一个外部配置文件,并在文件注册(要在命令行上简单地执行。您可以在下面找到它 )确保将其设为 您的第一个条目,以便尽快配置和加载 Logback。ServletContextListenerConfigLoadergrails-app/src/javaServletContextListenerweb.xmlweb.xmlgrails install-templatesgrails-app/src/templates/war/web.xml<listener/>web.xml

    我在 https://bowerstudios.com/node/896找到了这个解决方案以及完整的代码示例,这是我在这个主题上找到的最好和最短的示例,它似乎有效!

    这个解决方案只是加载了外部配置文件并在ConfigLoader类中使用它,但没有为整个 Grails 应用程序设置它。所以我在谷歌上搜索了更多,我从 Logback 找到了一个解决方案,可以在 GitHub (https://github.com/qos-ch/logback-extensions) 上找到并与 集成 Spring Framework,所以我从这个页面LogbackConfigurer这里开始上课并调整它们以满足我的需要。

    现在一切都像魅力一样工作,我能够创建一个外部配置文件 - 我最喜欢的是 - 它与默认情况下log注入到例如类的对象挂钩。Controller

希望这对其他开发人员也有帮助;)

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

于 2012-12-05T08:35:22.923 回答