2013-04-12 37 views
18

Tôi có một kịch bản Groovy cơ bản và tôi đang tìm cách tạo nhật ký đơn giản nhất có thể. Tôi muốn thông báo đi tới stdout, cũng như một tệp nhật ký và mỗi mục nhập trong tệp nhật ký sẽ có dấu thời gian.Đăng nhập vào Groovy Script

Tôi không thể sử dụng ký hiệu @Log, vì đó là tập lệnh và tôi không có lớp học để chèn vào. Điều này sẽ là lý tưởng nếu không tôi nghĩ.

Trả lời

23

Bạn có thể có mẫu bên dưới trong tập lệnh của mình (đã thử trong Trình soạn thảo Groovy).

import java.util.logging.Logger 

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

Kết quả nhật ký ở trên đến STDOUT. Để đăng nhập vào một tệp, bạn phải tạo một trình ghi nhật ký sử dụng getLogger. Theo dõi API để thuận tiện cho bạn.

21

Sử dụng chú thích đăng nhập là cách đơn giản nhất để bật ghi nhật ký. Kết hợp điều này với một chú thích nho để kéo xuống khung đăng nhập và bạn có mọi thứ bạn cần trong một kịch bản:

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

này sẽ không làm việc với kịch bản không có một lớp được định nghĩa, đó là những gì tôi nghĩ Steve đang ngụ ý. –

+2

@RomanGoyenko Đủ công bằng, nhưng các tập lệnh có thể được cấu trúc bằng cách sử dụng các lớp học. Ghi chú đăng nhập rất tiện lợi! –

2

Đây là nỗ lực của tôi lúc tạo ra một ví dụ rất nhỏ cho một số tính năng logback bao gồm đăng nhập vào một tập tin. Mở rộng câu trả lời @ Mark O'Connor trên

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 hoặc 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> 

Xem logback documentation cũng

Các vấn đề liên quan