2013-04-12 2 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") 

上記のログはSTDOUTに出力されます。それをファイルに記録するには、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

を参照してください

foo.groovy上記の@マーク・オコナーの答えを拡張私はスティーブが暗示していると思うクラスが定義されていないスクリプトで作業します。 –

+2

@RomanGoyenko十分な公正ですが、スクリプトもクラスを使用して構造化することができます。ロギングの注釈は非常に面白いです! –

2

ここでは、ファイルへのロギングなど、いくつかのlogbackの機能のための最小限の例を作成するに私の試みです。

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

関連する問題