【问题标题】:Use logback in grails 3在 grails 3 中使用 logback
【发布时间】:2015-03-29 06:28:26
【问题描述】:

Grails 3 使用logback 作为默认的日志系统。

我需要一个示例,说明如何以这种形式在 grails 3 中使用 logback

log.info("some Info")

【问题讨论】:

标签: logging grails logback


【解决方案1】:

您必须将记录器配置的第四个参数设置为false

logger('grails.app.controllers', INFO, ['STDOUT'], false)

那么日志不会显示两次。

我认为这是因为 root 记录器也捕获了 INFO

【讨论】:

  • 如果您还删除了['STDOUT'] 部分,则不必添加“假”(即加法标志)。您会得到重复的日志记录,因为(没有错误),您告诉 logback 通过根记录器(到 STDOUT)和通过这个特定的记录器追加。删除 STDOUT 意味着它只会通过根记录器附加。有关可加性标志的说明,请参阅 the documentation
  • @GreenGiant 的评论是我在 Grails 3.2.1 中的解决方案。日志记录对“运行应用程序”很有效,但对“测试应用程序”却不行。然后我注意到根记录器配置特别对待“dev”。我只是扩展了逻辑以包含“测试”环境,然后出现没有重复的日志记录:if ((Environment.isDevelopmentMode() || Environment.currentEnvironment == Environment.TEST) ...) { ...
【解决方案2】:

我只是在研究这个,因为我有类似的类似问题。 Grails 3 确实使用 Logback 进行日志配置,但 AST 转换仍然使用 Apache Commons Logging。

https://github.com/grails/grails-core/blob/master/grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.java

然后它使用 jcl-over-slf4j 桥将其全部映射回 Logback。

根据邮件列表http://grails.1312388.n4.nabble.com/Grails-2-1-1-Is-it-possible-to-replace-the-injected-log-object-td4638834.html,要全局替换注入的log,您必须排除日志记录依赖项并将AST Transformer 替换为您自己的。

上面评论中的博客文章提到的 Logback 插件提供了这个:https://github.com/grails-plugins/grails-logback/blob/master/src/java/org/codehaus/groovy/grails/compiler/logging/Slf4jTransformer.java。但是,这似乎有很多冗余,因为 Grails 3 已经支持 Logback。

如果您不想通过这项工作来更改日志注入,您可以通过使用 @Slf4j 注释类来覆盖记录器,这将覆盖该类的记录器。

【讨论】:

    【解决方案3】:
    import org.slf4j.Logger
    import org.slf4j.LoggerFactory
    
    static Logger log = LoggerFactory.getLogger(SomeClass.class)
    

    这可行,但我也想知道 grails 3 是否可以自动注入 log

    【讨论】:

      【解决方案4】:

      我试过这样,效果很好。这是来自petclinic 示例。

      更多详情,请访问logback docs

      import grails.util.BuildSettings
      import grails.util.Environment
      
      
      appender('STDOUT', ConsoleAppender) {
          encoder(PatternLayoutEncoder) {
              pattern = "%level %logger - %msg%n"
          }
      }
      
      root(ERROR, ['STDOUT'])
      
      if(Environment.current == Environment.DEVELOPMENT) {
          def targetDir = BuildSettings.TARGET_DIR
          if(targetDir) {
      
              appender("FULL_STACKTRACE", FileAppender) {
      
                  file = "${targetDir}/stacktrace.log"
                  append = true
                  encoder(PatternLayoutEncoder) {
                      pattern = "%level %logger - %msg%n"
                  }
              }
              logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )
          }
      }
      

      【讨论】:

      • 我遇到了一个让我质疑这段代码的问题:您确认数据实际上进入了 stacktrace.log 文件吗?看起来它正在工作,因为堆栈跟踪命中标准输出,但我的经验是它实际上并没有命中 stacktrace.log 文件。所以我想弄清楚是不是只有我一个人,或者这是否是互联网上几乎所有示例的问题。
      • this question——这似乎不会记录到stacktrace.log文件中。
      【解决方案5】:

      在 Grails 3 中也需要这个。找到 mrhaki 的这篇文章:

      grails 3 logging

      我在 Quartz 工作中对此进行了测试。我在logback.groovy中添加了以下行

      logger("grails.app.jobs", INFO, ['STDOUT'])
      

      在石英作业中使用测试日志:

      log.info "test " + new Date()
      

      在控制台中显示日志信息

      INFO grails.app.jobs.myapp.TestJob - test Tue Oct 20 10:07:31 CEST 2015
      

      有趣的事情正在发生。我看到每个 log.info 有 2 条重复行

      log.info "test"
      log.info "test2"
      System.out.println("test"3)
      

      给我:

      INFO grails.app.jobs.myapp.TestJob - test
      INFO grails.app.jobs.myapp.TestJob - test
      INFO grails.app.jobs.myapp.TestJob - test2
      INFO grails.app.jobs.myapp.TestJob - test2
      test3
      

      【讨论】:

      • false 添加到logger("grails.app.jobs", INFO, ['STDOUT'], false) 将删除重复的日志条目。
      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2011-12-23
      • 2016-05-11
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多