我想知道是否可以使用Groovy将新的日志记录方法动态添加到groovy.util.logging.Slf4j
,log.opsAlert(Exception)
其中:
void opsAlert(Exception exc) {
log.error("OPS_ALERT: ${ExceptionUtils.getStackTrace(exc)}")
}
这里的想法是,调用log.opsAlert(exc)
将与log.error(exc)
相同,但它会预先设置字符串" OPS_ALERT:"到每个堆栈跟踪。我希望在我的日志聚合器中使用它来通知ops需要立即关注的特殊异常。
我希望的完整例子:
package myapp.whatever
import groovy.util.logging.Slf4j
@Slf4j
class FizzBuzz {
void doSomething() {
// lots of code...
try {
// more code...
} catch(FizzException fizzExc) {
log.opsAlert(fizzExc)
}
}
}
有什么想法吗?
答案 0 :(得分:1)
是的,您可以添加这样的方法。这是一种方法。
从添加方法的装饰器开始。
import ch.qos.logback.classic.Logger
import groovy.transforms.TupleConstructor
import groovy.lang.Delegate
@TupleConstructor
class OpsAlertDecorator {
@Delegate Logger log
void opsAlert(Exception exc) {
error("OPS_ALERT: ${ExceptionUtils.getStackTrace(exc)}")
}
}
在这个示例中,Logger是ch.qos.logback.classic.Logger
我不确定@ Slf4j添加了什么类型的记录器,但无论它是什么,这都是委托需要设置的内容。换句话说,@Delegate def log
将不起作用。
然后你可以在需要时使用装饰器。
@Slf4j(value='realLogger')
class FizzBuzz {
def log
def FizzBuzz() {
log = new OpsAlertDecorator(realLogger)
}
void doSomething() {
// lots of code...
try {
// more code...
} catch(FizzException fizzExc) {
log.opsAlert(fizzExc)
}
}
}