我有一个基本的Groovy脚本,我希望尽可能简单地创建日志。我希望消息转到标准输出,以及一个日志文件,日志文件中的每个条目都有一个时间戳。
我不能使用@Log符号,因为它是一个脚本,我没有要注入的类。否则我认为这将是理想的。
下面是我尝试为几个logback功能创建的一个简单示例,包括登录到文件。扩展上述Mark O'Connor的答案
富。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留档
使用日志注释是在groovy中启用日志记录的最简单方法。将其与Grape注释相结合,以下拉日志框架,您可以在一个脚本中获得所需的一切:
//
// 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()
您可以在脚本中使用以下模式(在Groovy编辑器中尝试)。
import java.util.logging.Logger
Logger logger = Logger.getLogger("")
logger.info ("I am a test info log")
以上记录输出到标准输出。为了将其记录到文件中,您必须使用getLogger创建一个记录器。为方便起见,请遵循API。
我设置了一个cron任务来调用这个漂亮的脚本。在groovy脚本中,我使用“ch.qos.logback”来记录日志。 如果我手动运行脚本,日志工作正常,但是当通过cron作业运行时,没有输出到日志文件。 有人见过类似的问题吗?谢谢你!
问题内容: 我是Jenkins中使用的Groovy脚本的新手。我的问题是,我们如何根据作业名称和内部版本号获取作业的时间戳? 示例 :我想获取“ MyDeployJob”(JobName)的时间戳,并获取BuildNumber-105的时间戳。 我尝试使用方法方法,但无法正常工作。另外,我发现环境变量具有时间戳,但是我无法弄清楚如何使用Groovy Script获取细节。请帮助。 提前致谢。 问题
我有一些库脚本:lib1。groovy: lib2.groovy: lib3.groovy: 并希望在另一个脚本中使用它们:conf.groovy: conf.groovy是由用户配置的,他不知道我的后台lib脚本!他只知道提供的方法/任务:a()、b()、c()。实际上,我创建lib脚本是为了简化用户。 有没有办法将lib目录中的所有脚本(脚本lib1、lib2m、lib3)都包含到conf.g
我对Groovy很陌生,我想从主groovy脚本中的另一个groovy脚本中导入一个类。我已经看到了这篇文章。但是由于环境限制,我不能使用GroovyClassLoader之类的函数或导入任何库/框架。我唯一的可能性是使用评估方法。 我试过这个: 主脚本(评估不会抛出任何错误) Csvreader脚本 但是,我需要通过evaluate调用传递参数(并将方法移到类之外),或者需要创建类的实例。不幸的
我现在正在编写一个基本的PhP登录脚本,以便以后开发,我已经掌握了登录工具。php文件,但当我使用错误的详细信息登录(检查登录工具是否正常工作)时,我会出现以下错误: “PHP语法检查:解析错误:语法错误,第27行代码中出现意外的'$un'(T_变量)$q=”从username='$un'和pass=SHA1('$p')的用户中选择用户id、用户名“;” 任何关于为什么我得到这个错误的帮助都将不胜
我有一个Python Spark程序,我使用运行该程序。我想把日志记录语句放进去。 我想使用Spark使用的相同记录器,以便日志消息以相同的格式显示,并且级别由相同的配置文件控制。我该怎么做? 我尝试将语句放入代码中,并从。在这两种情况下,我都能看到Spark的日志消息,但我看不到。我一直在看Python日志文档,但没有从中找到答案。 不确定这是否是特定于提交给Spark的脚本,或者只是我不了解日