我如何能记录每一个与log4j的称为一类自动方法(How can i log every metho

2019-08-02 15:57发布

我有一个数据库调用类的,我一般要记录每一个所谓的(带参数)在这个类log4j的方法:

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

是否有可能自动地做到这一点? 也许通过某种标注在每个方法的开始,而不是写每一个logger.debug?

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

Answer 1:

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

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

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

本博客文章解释它一步一步: Java方法与AOP和注释记录



Answer 2:

如果你有声明要记录来电,您可以使用标准的代理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;
    }
  }


Answer 3:

一个可能的解决办法是用AspectJ。 想法是将附加方面的每一个你希望记录的方法,并进行日志记录方面,而不是一个方法。 AspectJ的日志记录的一个例子是这里的计算器 。



文章来源: How can i log every method called in a class automatically with log4j
标签: java log4j