logging - Groovy 脚本和 log4j

标签 logging groovy

一直在到处寻找 log4j 在 Groovy 脚本中记录到文件的工作示例。

没有明确的类(它只是一个脚本)。 没有 chalice 。 不是为了安慰...而是为了归档。

只是一个带有 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"
}

最佳答案

这是一个简单的示例,使用 @Grab 提取 log4j 库,然后使用内置 Groovy 的 @Log4j 注释连接到日志变量。

然后,您可以在脚本中配置记录器并添加 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.

不幸的是,config.groovy 文件记录器配置是 specific to Grails 。由于您不在 Grails 中,因此 DSL 无法解释 log4j 内容。不过看看ConfigSlurper在 Groovy 中,看起来它会为您提供类似的 DSL 来引入您的配置。

关于logging - Groovy 脚本和 log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19868180/

相关文章:

logging - 如何在 Inno Setup 中记录文件复制过程

web-services - 带有Grails的SOAP客户端请求

grails - 在Grails标记库中使用<<

gradle - 为什么需要指定 'from files'?

grails - Groovy 混合?

c++ - MMO游戏日志服务器设计

java - 记录器创建太多文件

python - 在AWS lambda函数中获取日志两次

java - 支持JDK 1.4的最新版Groovy是什么

c++ - 不正确的 boost 日志时间戳格式