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

时间:2015-10-13 19:32:05

标签: groovy slf4j

我想知道是否可以使用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)
        }
    }
}

有什么想法吗?

1 个答案:

答案 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)
        }
    }
}