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

Groovy脚本和log4j

司徒鸿文
2023-03-14

在Groovy脚本中到处搜索log4j日志记录到文件的工作示例。

没有显式类(它只是一个脚本)。没有圣杯。不到控制台。。。到文件。

只是一个带有log4j的普通groovy脚本。

log4j是最适合这一点的(groovy)还是其他日志库更好?

有人能给我举个例子或演示一下这是如何做到的吗?我设法把它送到控制台,但没有归档。

如果log4j配置也在config.groovy文件中,那就太好了,因为我正在为其他事情使用配置文件。

更新

多亏了neversleepz的例子,我可以很好地实现以下功能:

config.groovy文件:

log4j {  

  appender.stdout = "org.apache.log4j.ConsoleAppender"    
  appender."stdout.layout"="org.apache.log4j.PatternLayout"    
  appender.scrlog = "org.apache.log4j.FileAppender"    
  appender."scrlog.layout"="org.apache.log4j.PatternLayout"
  appender."scrlog.layout.ConversionPattern"="%d %5p %c{1}:%L - %m%n"         
  appender."scrlog.file"="rootscript.log" 
  rootLogger = "debug,scrlog,stdout"         
}

还有我的剧本:

import org.apache.log4j.*
import groovy.util.logging.*   

def config = new ConfigSlurper().parse(new File('config.groovy').toURL())        
PropertyConfigurator.configure(config.toProperties())

Logger log = Logger.getInstance(getClass())

// Need to set log level as described here: 
// http://groovy.329449.n5.nabble.com/log4j-annotation-not-working-td4368806.html
log.level = Level.INFO

// this will NOT print/write as the loglevel is info
log.debug 'Executing Script.'
// this will print
log.info 'Simple sample to show log INFO field is injected.'
log.warn 'Simple sample to show log WARN field is injected.'
log.error 'Simple sample to show log ERR field is injected.'        

谢谢你!

我还配置了RollingFileAppender,DailyRollingFileAppender我也会将它们放在这里:

log4j {
  //   
  appender.stdout = "org.apache.log4j.ConsoleAppender"
  appender."stdout.layout"="org.apache.log4j.PatternLayout"
  // 
  appender.scrlog = "org.apache.log4j.DailyRollingFileAppender"
  appender."scrlog.DatePattern"="'.'yyyy-MM-dd"
  appender."scrlog.Append"="true"
  appender."scrlog.File"="rootscript.log"
  appender."scrlog.layout"="org.apache.log4j.PatternLayout"
  appender."scrlog.layout.ConversionPattern"="%d %5p %c{1}:%L - %m%n"

  rootLogger="debug,scrlog,stdout"
}

log4j {
  //   
  appender.stdout = "org.apache.log4j.ConsoleAppender"
  appender."stdout.layout"="org.apache.log4j.PatternLayout"
  // 
  appender.scrlog = "org.apache.log4j.DailyRollingFileAppender"
  appender."scrlog.DatePattern"="'.'yyyy-MM-dd"
  appender."scrlog.Append"="true"
  appender."scrlog.File"="rootscript.log"
  appender."scrlog.layout"="org.apache.log4j.PatternLayout"
  appender."scrlog.layout.ConversionPattern"="%d %5p %c{1}:%L - %m%n"

  rootLogger="debug,scrlog,stdout"
  logger.ProcessLogger="debug,scrlog"
}

共有2个答案

郎健柏
2023-03-14

另一种方法是使用Groovy的日志包。您可以像在本例中一样轻松地使用导入util日志和使用@Log注释

import groovy.util.logging.*

@Log
class Test{
    public class() {
        log.debug "Logging"
    }
}

然而,由于注释在类上工作,因此需要在类中创建groovy脚本。自由格式脚本不能以这种方式访问记录器。

希望这有帮助。

邓鸿彩
2023-03-14

下面是一个简单的示例,使用Grab拉入log4j库,然后使用内置Groovy的log4j注释连接一个log变量。

然后,您可以在脚本中配置您的记录器并添加FileAppender

@Grab('log4j:log4j:1.2.17')

import org.apache.log4j.*
import groovy.util.logging.*

@Log4j
class HelloWorld{
    def execute() {
        // Need to set log level as described here: 
        // http://groovy.329449.n5.nabble.com/log4j-annotation-not-working-td4368806.html
        log.level = Level.INFO
        // add an appender to log to file
        log.addAppender(new FileAppender(new TTCCLayout(), 'myscript.log'));

        // this will NOT print/write as the loglevel is info
        log.debug 'Execute HelloWorld.'
        // this will print
        log.info 'Simple sample to show log field is injected.'
    }
}

def helloWorld = new HelloWorld()
helloWorld.execute()

跑步时你会在myscript.log看到这个

    11 [main] INFO HelloWorld - Simple sample to show log field is injected.

不幸的是,配置。groovy文件记录器配置特定于Grails。因为您不在Grails中,所以DSL并不是用来解释log4j的。然而,看看Groovy中的ConfigSlurper,它似乎会为您提供一个类似的DSL来引入您的配置。

 类似资料:
  • 问题内容: 我是Jenkins中使用的Groovy脚本的新手。我的问题是,我们如何根据作业名称和内部版本号获取作业的时间戳? 示例 :我想获取“ MyDeployJob”(JobName)的时间戳,并获取BuildNumber-105的时间戳。 我尝试使用方法方法,但无法正常工作。另外,我发现环境变量具有时间戳,但是我无法弄清楚如何使用Groovy Script获取细节。请帮助。 提前致谢。 问题

  • 我有一些库脚本:lib1。groovy: lib2.groovy: lib3.groovy: 并希望在另一个脚本中使用它们:conf.groovy: conf.groovy是由用户配置的,他不知道我的后台lib脚本!他只知道提供的方法/任务:a()、b()、c()。实际上,我创建lib脚本是为了简化用户。 有没有办法将lib目录中的所有脚本(脚本lib1、lib2m、lib3)都包含到conf.g

  • 我对Groovy很陌生,我想从主groovy脚本中的另一个groovy脚本中导入一个类。我已经看到了这篇文章。但是由于环境限制,我不能使用GroovyClassLoader之类的函数或导入任何库/框架。我唯一的可能性是使用评估方法。 我试过这个: 主脚本(评估不会抛出任何错误) Csvreader脚本 但是,我需要通过evaluate调用传递参数(并将方法移到类之外),或者需要创建类的实例。不幸的

  • 我有一个基本的Groovy脚本,我希望尽可能简单地创建日志。我希望消息转到标准输出,以及一个日志文件,日志文件中的每个条目都有一个时间戳。 我不能使用@Log符号,因为它是一个脚本,我没有要注入的类。否则我认为这将是理想的。

  • 当我尝试在soapUI测试步骤中解析响应时,收到了以下异常。也尝试了getXMLHolder方法。还是没运气。 答复如下

  • 有人能解释jenkins中执行groovy脚本和执行系统groovy脚本之间的区别吗?以及如何使用执行系统groovy脚本将脚本调用到从属。