2015-10-13 296 views
0

我想知道是否有可能使用Groovy到一个新的测井方法动态添加到groovy.util.logging.Slf4jlog.opsAlert(Exception)其中:添加方法groovy.util.logging.Slf4j注释?

void opsAlert(Exception exc) { 
    log.error("OPS_ALERT: ${ExceptionUtils.getStackTrace(exc)}") 
} 

这里的想法是,调用log.opsAlert(exc)会做同样的log.error(exc)但预先考虑字符串“OPS_ALERT:”每个堆栈跟踪。我希望在我的日志聚合器中使用它来通知需要立即关注的特殊异常操作。

什么,我希望全例如:

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

是的,你可以添加这样的方法。这是一种方法。

添加装饰品

从装饰者开始,添加方法。

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将不起作用。

使用Decorator

然后,当你需要它,你可以使用装饰。

@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) 
     } 
    } 
}