2012-11-13 27 views
9

自动我有一个数据库调用类的,我一般都希望在这个类来记录每一个调用(带参数)方法的log4j:我如何能记录每一个称为一个类的方法与log4j的

logger.debug("foo(id="+id+") initiated"); 

是否有可能自动执行此操作?也许通过在每个方法的开始使用某种注释而不是写每一个logger.debug?

今天,我有我每次改变参数或方法名的时间来更新我的logging.debug。

+0

AOP可能值得尝试。 – Nishant

回答

6

尝试@Loggable注释和jcabi-aspects一个AspectJ方面(我是一个开发者):

@Loggable(Loggable.INFO) 
public String load(URL url) { 
    return url.openConnection().getContent(); 
} 

所有方法的调用都是通过SLF4J记录。

5

如果有声明要记录来电,您可以使用标准的代理API来实现你想要什么方法接口。

的代理API将允许你包装你的实际执行在一个新的代理类,会记录通话,并且转发调用执行。你只需要实现一个InvocationHandler来做记录和转发。

例如,

interface Calculator { 
    int add(int a, int b); 
} 

class CalculatorImpl implements Calculator { 
    @Override public int add(int a, int b) { return a+b; } 
} 

class LoggingInvocationHandler implements InvocationHandler { 
    private final Object delegate; 
    public LoggingInvocationHandler(final Object delegate) { 
    this.delegate = delegate; 
    } 
    @Override invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    System.out.println("method: " + method + ", args: " + args); 
    return method.invoke(delegate, args); 
    } 
} 

class X { 
    public static void main(String... args) { 
    final Calculator calc = new CalculatorImpl(); 
    final Calculator loggingCalc = 
     (Calculator) Proxy.newProxyInstance(X.class.getClassLoader(), 
              new Class[] {Calculator.class}, 
              new LoggingInvocationHandler (calc)); 
    loggingCalc.add(2, 3); // shall print to the screen 
    } 
} 

你也可以轻松,只需在InvocationHandler更改代码记录由方法抛出的返回值和异常。另外,您可以使用您喜欢的任何日志框架,而不是像示例中那样使用System.out.println

要登录返回值和异常,你可以这样做:

@Override invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    System.out.println("method: " + method + ", args: " + args); 
    try { 
     final Object ret = method.invoke(delegate, args); 
     System.out.println("return: " + ret); 
     return ret; 
    } catch (Throwable t) { 
     System.out.println("thrown: " + t); 
     throw t; 
    } 
    } 
4

一个可能的解决办法是用AspectJ。想法是将方面附加到您希望记录的每种方法上,并且执行记录是方面而不是方法。 aspectj日志的一个例子是right here in stackoverflow

相关问题