当前位置: 首页 > 知识库问答 >
问题:

Groovy Slf4j注释似乎干扰了Grails内置的日志记录

严瀚昂
2023-03-14

我创建了一个Grails 2.4.5应用程序(Grails创建应用程序myapp),并在src/Groovy下添加了大量Groovy类。对于任何需要日志记录的类,我使用了@Slf4j注释,如下所示:

package com.example.myapp

import groovy.util.logging.Slf4j

@Slf4j
class MyObject {
    def doSomething() {
        log.info('I'm going to do something now.')
    }
}

Grails生成的类也是如此,比如控制器和服务(也就是说,我使用<code>@Slf4j</code>注释处理所有事情)。我终于可以在本地运行<code>myapp

这是我在Config.groovy中的日志配置:

log4j.main = {
    console name: "stdout", layout: pattern(conversionPattern: "%c{2} %m%n")

    info  'com.example.myapp' // I'm hoping this is a wildcard that actually
                              // means 'com.example.myapp.*'

    error  'org.codehaus.groovy.grails.web.servlet',
           'org.codehaus.groovy.grails.web.pages',
           'org.codehaus.groovy.grails.web.sitemesh',
           'org.codehaus.groovy.grails.web.mapping.filter',
           'org.codehaus.groovy.grails.web.mapping',
           'org.codehaus.groovy.grails.commons',
           'org.codehaus.groovy.grails.plugins',
           'org.codehaus.groovy.grails.orm.hibernate',
           'org.springframework',
           'org.hibernate',
           'net.sf.ehcache.hibernate'
}

我知道Grails使用log4j,但是我认为Grails自带SLF4J绑定,所以这些< code>@Slf4j注释应该可以工作。我试着把< code > ' org . slf4j:slf4j-log4j 12:1 . 7 . 5 ' 放在我的编译路径上,但是这也不起作用(并且产生slf4j错误,抱怨类路径上有多个绑定;这证实了我的理论,即Grails自带SLF4J绑定)。

我需要做些什么才能让日志在这里工作?这是我需要的:

    < li >我需要为< code>com.me.myapp下的所有包/类配置日志记录,如果能在我的log4j配置中提供某种通配符,如< code>com.me.myapp.*,那就太好了 < li >任何使用< code>@Slf4j注释的Groovy类,无论是在我的Grails应用程序(< code>myapp)中html" target="_blank">定义的,还是在第三方jar中定义的,都必须支持它们的日志记录

请注意:在Grails之外,我绝对喜欢logback。但是根据我的经验,我发现Grails Logback插件被严重破坏了,所以我对从log4j -切换过来不感兴趣

共有1个答案

彭风华
2023-03-14

您是正确的,info'com.example.myapp'本质上是com.example.myapp.*的通配符,因此应该可以工作。我发现当日志记录不能按预期工作并且记录器的名称可能错误时,为记录器名称添加println语句通常会清除错误配置的内容。因此,例如在控制器或服务中,只需添加

println "logger name for ${getClass().name} is $log.name"

并在调用该控制器操作或服务方法后在控制台中查找该消息。

 类似资料:
  • Spring Boot使用<code>LoggingApplicationListener<code>自动初始化底层日志记录系统。如果我正在开发的应用程序独立运行或独立运行,这是一件好事。 然而,我正在开发一个web应用程序,该应用程序将部署到WSO2应用程序服务器中,该服务器提供统一的日志记录(使用log4j),具有中央日志级别管理(在运行时通过web界面)、业务报告等功能。 如果我使用Spri

  • 我试图自定义Grails应用程序的日志配置,但appender(及其布局模式)似乎被忽略了。 在配置中。非常棒: Log4J实际上考虑了logger部分(例如,如果我对hibernate的debug和trace行进行注释,那么hibernate语句的记录将按预期停止)。 但我一直在尝试appenders部分的不同版本,似乎都没有考虑,实际上应用于控制台的格式只包括消息本身(例如,如果我编写 在代码

  • 每当我部署一个外部化配置有错误的生产应用程序时,我都会在Tomcat日志中收到以下消息: 显然,外部化的配置是在log4j被正确初始化之前处理的,因此没有附加程序可以接受来自的消息。 有没有办法预先初始化log4j,以便在标准Grails log4j初始化发生之前捕获这些消息?

  • 问题内容: 我有一个log4J设置,其中根记录器应该将ERROR级别和更高级别的消息记录到控制台,另一个记录器将所有内容记录到syslog中。 log4j.properties是: 用代码我做 发生的事情是我获得了所有日志记录级别的控制台日志记录。似乎正在发生的事情是SGSearch的级别以某种方式覆盖了为根记录程序设置的级别。我不知道。 我已经确认Log4J正在读取我认为是的属性文件,并且没有其

  • 我试图使用注释处理器来生成特定工厂接口的实现。这些接口如下所示: 和 注释处理器正在做正确的事情,并为每个匹配的类生成一个工厂,该工厂用相应的注释进行注释。 注释处理器的输出如下所示: 以及相应的其他类: 但是不能编译TestViewImFactory。错误消息是: “类'TestViewImplFactory'必须声明为抽象或在'ViewFactory'中实现抽象方法创建” Java说,以下是正

  • 我创建了以下groovy脚本,以展示如何使用简单的注释将日志字段注入我们的类 当我运行groovy脚本时,我得到以下结果(在GROOVY CONSOLE上) 请告知我们如何将结果打印到WIN机器中的日志文件中,以及需要向groovy脚本中添加什么才能启用它? 例如: 日志文件 C: \程序文件\日志\我的。非常棒。日志 (应包含结果:)