添加方法到 groovy.util.logging.Slf4j 注释?
Add method to groovy.util.logging.Slf4j annotation?
我想知道是否可以使用 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)
}
}
}
有什么想法吗?
是的,你可以添加这样的方法。这是一种方法。
添加装饰器
从添加该方法的装饰器开始。
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)}")
}
}
在这个例子中,记录器是 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)
}
}
}
我想知道是否可以使用 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)
}
}
}
有什么想法吗?
是的,你可以添加这样的方法。这是一种方法。
添加装饰器
从添加该方法的装饰器开始。
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)}")
}
}
在这个例子中,记录器是 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)
}
}
}