Groovy Script и log4j

Ищите здесь и там поиск рабочего примера log4j logging для файла в Groovy script.

Нет явного класса (это просто script). Нет грааля. Не пустить консоль... в файл.

Просто обычный Groovy script с log4j.

Лучше ли для этого 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"         
}

И мой script:

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"
}

Ответы

Ответ 1

Вот простой пример использования @Grab для вставки log4j lib, а затем используя встроенную аннотацию Groovy @Log4j для проводки в переменной log.

Затем вы можете настроить свой регистратор в script и добавить 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. Однако посмотрите ConfigSlurper в Groovy, похоже, что он предоставит вам аналогичный DSL для ввода вашей конфигурации.

Ответ 2

Другой способ сделать это - использовать Groovy logging package. Вы можете легко использовать то же самое, что и импортировать журнал использования и использовать аннотацию @Log, как в этом примере.

import groovy.util.logging.*

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

Однако, поскольку аннотация работает над классом, вам нужно создать свой Groovy script внутри класса. Скрипты свободной формы не получают доступ к журналу таким образом.

Надеюсь, что это поможет.