Groovy脚本和log4j

Bea*_*ean 20 groovy logging

在这里和那里寻找一个log4j在Groovy脚本中记录到文件的工作示例.

没有明确的类(它只是一个脚本).没有grails.不要控制...要归档.

只是一个带有log4j的简单groovy脚本.

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

有人可以指出我的例子或演示如何做到这一点?我设法让它到控制台,但没有提交.

如果log4j配置也在config.groovy文件中会很好,因为我正在使用配置文件来处理其他事情.

UPDATE

感谢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"         
}
Run Code Online (Sandbox Code Playgroud)

我的剧本:

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.'        
Run Code Online (Sandbox Code Playgroud)

谢谢你!

我还配置了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"
}
Run Code Online (Sandbox Code Playgroud)

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"
}
Run Code Online (Sandbox Code Playgroud)

nev*_*epz 11

这是一个简单的例子,用于@Grab引入log4j lib,然后使用内置的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()
Run Code Online (Sandbox Code Playgroud)

运行时,你会在你的myscript.log中看到这个

    11 [main] INFO HelloWorld - Simple sample to show log field is injected.
Run Code Online (Sandbox Code Playgroud)

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


byt*_*ile 5

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

import groovy.util.logging.*

@Log
class Test{
    public class() {
        log.debug "Logging"
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于注释适用于类,因此您需要在类中创建groovy脚本.自由格式脚本不会以这种方式获取记录器.

希望这可以帮助.