私は基本的なGroovyスクリプトを持っています。できるだけ簡単にログを作成しようとしています。私は、メッセージをstdoutとログファイルに入れ、ログファイルの各エントリにタイムスタンプが付いているようにします。Groovyスクリプトでのログイン
@Log表記はスクリプトなので使用できません。また、私は注入するクラスがありません。そうでなければ理想的だったでしょう。
私は基本的なGroovyスクリプトを持っています。できるだけ簡単にログを作成しようとしています。私は、メッセージをstdoutとログファイルに入れ、ログファイルの各エントリにタイムスタンプが付いているようにします。Groovyスクリプトでのログイン
@Log表記はスクリプトなので使用できません。また、私は注入するクラスがありません。そうでなければ理想的だったでしょう。
スクリプト(Groovy Editorで試してみました)に以下のパターンを入れることができます。
import java.util.logging.Logger
Logger logger = Logger.getLogger("")
logger.info ("I am a test info log")
上記のログはSTDOUTに出力されます。それをファイルに記録するには、getLogger
を使用してロガーを作成する必要があります。あなたの便宜のためAPIに従ってください。
ログアノテーションは、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()
ここでは、ファイルへのロギングなど、いくつかの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
を参照してください
foo.groovy上記の@マーク・オコナーの答えを拡張私はスティーブが暗示していると思うクラスが定義されていないスクリプトで作業します。 –
@RomanGoyenko十分な公正ですが、スクリプトもクラスを使用して構造化することができます。ロギングの注釈は非常に面白いです! –