我如何在 src/groovy/ 类中使用“日志”

Posted

技术标签:

【中文标题】我如何在 src/groovy/ 类中使用“日志”【英文标题】:How can i use 'log' inside a src/groovy/ class 【发布时间】:2011-02-04 09:02:27 【问题描述】:

我遇到了这个错误:

groovy.lang.MissingPropertyException: 没有这样的属性:类日志: org.utils.MyClass

这是课程的内容:

package org.utils

class MyClass 
    int organizationCount = 0

    public int getOrganizationCount()
        log.debug "There are $organizationCount organization(s) found."
        return organizationCount
    


我需要添加导入语句吗?我需要添加什么?请注意,该类位于 src/groovy/org/utils 中。我知道在控制器、服务等中可以访问“日志”变量。在“src”类中不确定。

谢谢。

【问题讨论】:

【参考方案1】:

在 grails 3 中,默认的日志系统是 logback。只需将@Slf4j 注释添加到您的 src/groovy 类即可。

import groovy.util.logging.Slf4j

@Slf4j
class MyUtil 

【讨论】:

【参考方案2】:

在 Groovy 1.8 中,您还可以使用 @Log(对于 java.util.logging)或 @Log4j(对于 log4j)注释该类,它会“神奇地”拥有一个 log 属性。详情请见http://docs.codehaus.org/display/GROOVY/Groovy+1.8+release+notes#Groovy1.8releasenotes-@Log。

PS.:如果您使用 java.util.logging,log.debugcall 仍然会失败,因为没有 debug 方法。

【讨论】:

【参考方案3】:

log 变量是由 grails 注入的,因此只能在 grails 特定的类(如控制器、服务等)中使用 - 我认为您不能以任何方式“导入”它。

在这些类之外,您只需要“定期”使用 log4j,即

Logger.getLogger(MyClass.class).debug()

【讨论】:

感谢领导!不幸的是,我在使用“调试”方法时遇到了问题。我遇到了这个异常:错误:没有方法签名:java.util.logging.Logger.debug() 适用于参数类型:(org.codehaus.groovy.runtime.GStringImpl) 值:[有 15363 个组织( s) 找到。] 但是,当我尝试“信息”级别时,一切都找到了。下面是示例代码: String s = "找到 $organizationCount 个组织。" Logger.getLogger(this.class.getName()).info(s) 请注意,当我将 'info' 替换为 'debug' 时,我遇到了该异常。 @firnnauriel:看起来您遇到了重载调试方法与 groovy 类型魔法的问题。尝试使用 + 而不是 GString 将字符串构建为“传统”Java 字符串。 你也可以使用 Log4j,它会在参数上调用 toString(),所以不管它是 GString 还是 String。只需导入 org.apache.log4j.Logger 而不是 JUL Logger。【参考方案4】:

Log4j 是 groovy 的最佳日志记录之一

import groovy.util.logging.Log4j

@Log4j
public class MyClass
//Use for logger check
public static void myMethod()
    //log.error(null, "This is the log message", throwable)

    //log.error(null, "This is the log message", throwable)

    //log.info("This is the message for info")

    //log.debugg("This is the message for debugging")


Log4j.properties

# Define the root logger with appender file
log =folderpath
log4j.rootLogger=INFO, R, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss %-5p %c1:%L - %m%n
# %dyyyy-MM-dd HH:mm:ss %-5p %c1:%C:%L [%t]  - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=$log/filename.log

log4j.appender.R.MaxFileSize=2048KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern="%d %5p %c1:%L - %m%n"
# %dyyyy-MM-dd HH:mm:ss %-5p %c1:%C:%L [%t]  - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss %-5p %c1:%L - %m%n

希望对您有所帮助....

【讨论】:

【参考方案5】:

我已经在使用 Logback 的 grails 3.1.8 中完成了这项工作。

import org.apache.commons.logging.LogFactory

public class MyClass

   static final LOG = LogFactory.getLog(this)

   def function()
     LOG.debug "Debug message"
   

   static staticFunction()
     LOG.debug "Another debug message"
   

【讨论】:

以上是关于我如何在 src/groovy/ 类中使用“日志”的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Grails 服务注入 src/groovy 类

如何在类中运行numpy日志

如何仅使用开发人员的日志过滤日志?

python_如何在类中定义装饰器

Grails:服务 VS Groovy 类

Log4j 2.0 - 日志文件中没有出现日志 - 使用 log4j2.xml 在同一类中尝试多个记录器