2013-04-12 238 views
18

我有一個基本的Groovy腳本,我正在儘可能簡單地創建日誌。我希望消息轉到stdout以及日誌文件,並且日誌文件中的每個條目都會有一個時間戳。登錄Groovy腳本

我不能使用@Log符號,因爲它是一個腳本,而且我沒有要注入的類。否則我認爲這將是理想的。

回答

23

您可以在腳本中使用以下模式(在Groovy Editor中嘗試)。

import java.util.logging.Logger 

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

上述日誌輸出到標準輸出。爲了將其記錄到文件中,您必須使用getLogger創建記錄器。按照API爲您提供方便。

21

使用日誌註解是在groovy中啓用日誌記錄的最簡單方法。用葡萄註釋一起使用能拉下日誌框架,你有你在一個腳本中所需要的一切:

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

這不會使用沒有定義的類的腳本,這是我認爲Steve所暗示的。 –

+2

@RomanGoyenko足夠公平,但腳本也可以使用類來構造。日誌記錄非常漂亮! –

2

這是我在創造的logback幾個功能,包括記錄到文件中的小例子嘗試。擴展上面

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

logback documentation