【问题标题】:Log4j is already not configured via logback.groovy file in Grails 3.2.8Log4j 尚未通过 Grails 3.2.8 中的 logback.groovy 文件配置
【发布时间】:2017-08-25 02:35:30
【问题描述】:

我们知道,默认情况下,Grails 3.0 中的日志记录由 Logback 日志框架处理,并且可以使用 grails-app/conf/logback.groovy 文件进行配置。这样做的好处是该文件中的配置适用于 Logback 和 Log4j 实现(在 Grails 3.1.2 中成功测试)。在我们从 Grails 3.1.2 迁移到使用 Grails 3.2.8 之后(正如我之前所说),Log4j 似乎没有使用 logback.groovy 文件中的配置,它应该以其他方式配置 - 在运行时。

我对此进行了深入研究,以确保这确实是它现在的配置方式,并且似乎如果我使用默认的 Log4j 日志记录:

org.apache.log4j.Logger.getLogger("name").info("TEST");

根本不工作。要将信息填充到输出日志文件中,我应该使用默认的 SLF4J API:

org.slf4j.LoggerFactory.getLogger("name").info("TEST");

这里的问题是因为我们在代码中有很多地方使用 Log4j 方法实现了日志记录,而现在 - 日志文件中没有写入任何内容。

所以我在这里有两个问题。第一个 - 这是 Grails 实现这种行为的确切方式(官方文档中没有提到 - Grails 3.2.8 Documentation)。第二个 - 是 XML 或 RUNTIME 配置是配置 Log4j 的最佳方式,所以像以前一样使用它。如果是 - 这里的坏事是我们应该一次维护两个相同的配置。有没有其他方法可以配置 Log4j 以使用与 Grails Logger 相同的配置。

附:无需发布任何代码,都是默认配置。

非常感谢!

【问题讨论】:

    标签: grails logging log4j


    【解决方案1】:
    appender('STDOUT', ConsoleAppender) {
        encoder(PatternLayoutEncoder) {
            charset = Charset.forName('UTF-8')
        }
    }
    
    root(ERROR, ['STDOUT'])
    logger("<package_name>", DEBUG)
    
    List artifacts = ["conf", "controllers", "domain", "init"]
    artifacts.each { artifact ->
        logger("grails.app.${artifact}.<package_name>", DEBUG)
    }
    

    写完之后,您可以在上面提到的任何工件中添加用于调试的记录器,例如:

    log.debug "Any Message"
    

    更多设置可以在这里阅读:https://logback.qos.ch/manual/groovy.html

    【讨论】:

    • 正如我在上一篇文章中提到的,使用默认配置(如您在此处所写)只需编写“log.debug“任何消息””就可以更轻松地登录控制器和服务。这是可能的,因为在这些文件中,默认记录器是静态导入的。这样消息将被写入日志文件。这里的问题不在于默认的 Grails 记录器,而在于 Log4j 配置。在我们之前使用的 Grails 版本 3.1.2 中,Logback 和 Log4j 这两个实现的配置都是使用 logback.groovy 文件进行的,但现在只有 Logback 使用它。
    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 2017-09-24
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多