2013-04-12 14 views
18

Mam podstawowy skrypt Groovy i staram się tworzyć logi tak prosto, jak to tylko możliwe. Chcę, aby wiadomość przechodziła na standardowe wyjście, a także plik dziennika, a każdy wpis w pliku dziennika miałby znacznik czasu.Logowanie do Groovy Script

Nie mogę użyć notacji @Log, ponieważ jest to skrypt i nie mam klasy, do której można wstrzyknąć. Byłoby idealnie inaczej, jak sądzę.

Odpowiedz

23

Możesz mieć poniższy wzór w swoim skrypcie (wypróbowany w edytorze Groovy).

import java.util.logging.Logger 

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

Powyższe logi są wyprowadzane na STDOUT. Aby zalogować się do pliku, musisz utworzyć program rejestrujący przy użyciu getLogger. Postępuj zgodnie z API dla Twojej wygody.

21

Korzystanie z funkcji Adnotacja to najprostszy sposób na włączenie logowania. W połączeniu z adnotacją Grape ciągnąć w dół ramy rejestrowania i masz wszystko, czego potrzebujesz w jednym skrypcie:

// 
// 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

nie byłoby pracować ze skryptem, który nie ma zdefiniowanej klasy, co jest moim zdaniem, jak sugeruje Steve. –

+2

@RomanGoyenko Wystarczająco fair, ale skrypty mogą być również ustrukturyzowane przy użyciu klas. Adnotacja do logowania jest bardzo dobra! –

2

Oto moja próba stworzenia minimalny przykład dla kilku cech logback tym logowanie do pliku. Rozszerzanie odpowiedź @Mark O'Connor powyżej

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 lub 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> 

Zobacz logback documentation także