自动我有一个数据库调用类的,我一般都希望在这个类来记录每一个调用(带参数)方法的log4j:我如何能记录每一个称为一个类的方法与log4j的
logger.debug("foo(id="+id+") initiated");
是否有可能自动执行此操作?也许通过在每个方法的开始使用某种注释而不是写每一个logger.debug?
今天,我有我每次改变参数或方法名的时间来更新我的logging.debug。
自动我有一个数据库调用类的,我一般都希望在这个类来记录每一个调用(带参数)方法的log4j:我如何能记录每一个称为一个类的方法与log4j的
logger.debug("foo(id="+id+") initiated");
是否有可能自动执行此操作?也许通过在每个方法的开始使用某种注释而不是写每一个logger.debug?
今天,我有我每次改变参数或方法名的时间来更新我的logging.debug。
尝试@Loggable
注释和jcabi-aspects一个AspectJ方面(我是一个开发者):
@Loggable(Loggable.INFO)
public String load(URL url) {
return url.openConnection().getContent();
}
所有方法的调用都是通过SLF4J记录。
如果有声明要记录来电,您可以使用标准的代理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;
}
}
一个可能的解决办法是用AspectJ。想法是将方面附加到您希望记录的每种方法上,并且执行记录是方面而不是方法。 aspectj日志的一个例子是right here in stackoverflow。
AOP可能值得尝试。 – Nishant