【问题标题】:Grails 2.1.1 - Logback integrationGrails 2.1.1 - Logback 集成
【发布时间】:2012-12-03 14:15:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: grails logback


    【解决方案1】:

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

    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) 一定要做到第一 &lt;listener/&gt; 中的 web.xml 条目以便 Logback 获取 尽快配置和加载。

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

      这个解决方案只是加载了外部配置文件并使用 它在ConfigLoader 类中,但没有为整个设置它 Grails 应用程序。所以我用谷歌搜索了更多,我发现了一个 来自 Logback 的解决方案,可在 GitHub (https://github.com/qos-ch/logback-extensions) 获得并与 Spring Framework,所以我从page 中学习了这些课程 来自hereLogbackConfigurer 类并调整它们以适应 我的需要。

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

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

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

    【讨论】:

    • 感谢您的建议 - 似乎 Burt 仅在 10 天前上传了该插件......所以,从我提出问题的日期可以看出,该插件一定是在开发中,或者不是暂时没想到。该插件本身似乎很有希望!我一定会检查出来的!此外,在log 对象上缺少对 AST 转换的 IDE 支持仍然存在问题......破解了 Intellij IDEA 插件来解决这个问题,但它似乎不是解决问题的“漂亮”解决方案......我还为此提交了一个错误报告:youtrack.jetbrains.com/issue/IDEA-97383
    • apache和sl4j的日志对象有什么区别?我的意思是他们都暴露了标准的日志方法,比如info()error()debug()
    • 确实如此,但 org.apache.commons.logging.Log 对象仅实现 log.info(Object o)log.info(Object o, Throwable t),而 org.slf4j.Logger 还可以处理 MDC、对象数组等等,这非常有用(请参阅commons.apache.org/logging/apidocs/org/apache/commons/logging/… 用于org.apache.commons.logging.Logslf4j.org/api/org/slf4j/Logger.html 用于org.slf4j.Logger 描述...
    • 谢谢。 Afaik MDC 的使用与 logger 对象方法无关(仅与 appender 模式定义有关),并且对象数组参数对于 groovy 字符串表达式也是无用的。
    • 确实,对象数组参数似乎没用,但是拥有标记的可能性以及 SLF4J 记录器所提供的所有舒适的东西确实对我产生了巨大的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多