添加方法到 groovy.util.logging.Slf4j 注释?

Add method to groovy.util.logging.Slf4j annotation?

我想知道是否可以使用 Groovy 将新的日志记录方法动态添加到 groovy.util.logging.Slf4jlog.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)
        }
    }
}