20

一直在到处搜索,寻找一个在 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"
}
4

2 回答 2

12

这是一个简单的示例,@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.

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

于 2013-11-09T02:06:16.180 回答
5

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

import groovy.util.logging.*

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

但是,由于注释适用于类,因此您需要在类中创建 groovy 脚本。自由形式的脚本无法通过这种方式访问​​记录器。

希望这可以帮助。

于 2013-11-09T07:44:57.280 回答