2013-04-12 19 views
18

Ho uno script Groovy di base e sto cercando di creare i registri nel modo più semplice possibile. Voglio che il messaggio vada allo stdout, così come un file di log, e ogni voce nel file di log dovrebbe avere un timestamp.Registrazione in Groovy Script

Non riesco a utilizzare la notazione @Log, perché è uno script e non ho una classe in cui inserirmi. Questo sarebbe stato l'ideale altrimenti credo.

risposta

23

È possibile avere il modello sottostante nello script (provato in Groovy Editor).

import java.util.logging.Logger 

Logger logger = Logger.getLogger("") 
logger.info ("I am a test info log") 

I registri precedenti vengono inviati a STDOUT. Per registrarlo in un file, è necessario creare un logger usando getLogger. Seguire lo API per comodità.

21

L'utilizzo dell'annotazione del registro è il modo più semplice per abilitare la registrazione in Groovy. Combinate questo con un'annotazione di uva per tirare giù il quadro di registrazione e si dispone di tutto il necessario in uno script:

// 
// Dependencies 
// ============ 
import groovy.util.logging.Slf4j 

@Grapes([ 
    @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.13') 
]) 

// 
// Classes 
// ======= 

@Slf4j 
class StandardGreeting { 

    def greet() { 
     log.trace "Hello world" 
     log.debug "Hello world" 
     log.warn "Hello world" 
     log.info "Hello world" 
     log.error "Hello world" 
    } 
} 

@Slf4j 
class SpecialGreeting { 

    def greet() { 
     log.trace "Hello world" 
     log.debug "Hello world" 
     log.warn "Hello world" 
     log.info "Hello world" 
     log.error "Hello world" 
    } 
} 

@Slf4j 
class GreetingRunner { 

    def greetings = [new StandardGreeting(), new SpecialGreeting()] 

    def run() { 
     log.info "Starting to talk" 

     greetings.each { 
      it.greet() 
     } 

     log.info "Finished talking" 
    } 
} 

// 
// Main program 
// ============ 
def runner = new GreetingRunner() 

runner.run() 
+2

Questo non sarebbe lavorare con lo script che non ha una classe definita che è ciò che penso Steve stia insinuando. –

+2

@RomanGoyenko Abbastanza giusto, ma gli script possono essere strutturati anche con le classi. L'annotazione di registrazione è molto elegante! –

2

Ecco il mio tentativo di creare un esempio minimo per diverse funzioni, tra cui logback registrazione in un file. Estendere la risposta di @ Mark O'Connor sopra

foo.groovy:

import groovy.util.logging.Slf4j 

@Grab('ch.qos.logback:logback-classic:1.2.1') 

@Slf4j 
class Foo { 
    @Slf4j 
    static class Bar { 
     def bar() { 
      assert log.name == 'Foo$Bar' 
      assert log.class == ch.qos.logback.classic.Logger 
      log.trace "bar" 
      log.debug "bar" 
      log.warn "bar" 
      log.info "bar" 
      log.error "bar" 
     } 
    } 

    def foo() { 
     assert log.name == "Foo" 
     assert log.class == ch.qos.logback.classic.Logger 
     log.trace "foo" 
     log.debug "foo" 
     log.warn "foo" 
     log.info "foo" 
     log.error "foo" 
    } 
} 

@Slf4j 
class Baz { 
    def baz() { 
     log.name = 'Baz' 
     assert log.name == 'Baz' 
     assert log.class == ch.qos.logback.classic.Logger 
     log.trace "baz" 
     log.debug "baz" 
     log.warn "baz" 
     log.info "baz" 
     log.error "baz" 
    } 
} 

new Foo().foo() 
new Foo.Bar().bar() 
new Baz().baz() 

logback-Test.xml o logback.xml:

<configuration debug="true"> <!-- debug attr enables status data dump --> 

    <timestamp key="sec" datePattern="yyyyMMdd_HHmmss"/> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
     <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <!-- see Chapter 6 Layouts for format specifiers --> 
     </encoder> 
    </appender> 

    <!-- for RollingFileAppender see Chapter 3 Appenders --> 
    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>foo_${sec}.log</file> 
     <append>true</append> <!-- true is the default for append --> 
     <immediateFlush>true</immediateFlush> <!-- true is the default for immediateFlush --> 
     <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <!-- TRACE < DEBUG < INFO < WARN < ERROR --> 
    <!-- Read Chapter 2 Architecture of logback doc for effective 
     level (level inheritance) and accumulation (appender additivity) --> 
    <root level="debug"> 
     <appender-ref ref="STDOUT"/> 
    </root> 

    <logger name="Foo" level="trace" additivity="true"> 
     <appender-ref ref="FILE"/> 
    </logger> 

    <!-- if a logger isn't specified for a name, its level="null" and additivity="true", "null" being synonymous to "inherited" --> 

    <!-- '$' acts as '.' it seems --> 
    <logger name="Foo$Bar" level="inherited" additivity="true"/> <!-- if additivity false, no appender, otherwise, STDOUT and FILE --> 

</configuration> 

Vedi logback documentation anche

Problemi correlati