Java 方便地记录方法调用?

Java 方便地记录方法调用?,java,Java,我正在寻找一种方法来自动化一个我经常执行的艰巨的机械过程:在一个方法上实现跟踪日志记录 考虑以下虚构的方法 private void createBaz(String key, String databaseConfigKey, String query) { this.queries.put(key, query); this.databases.put(key, Database.forKey(databaseConfigKey)); } private void crea

我正在寻找一种方法来自动化一个我经常执行的艰巨的机械过程:在一个方法上实现跟踪日志记录

考虑以下虚构的方法

private void createBaz(String key, String databaseConfigKey, String query) {
    this.queries.put(key, query);
    this.databases.put(key, Database.forKey(databaseConfigKey));
}

private void createFrob(String key, String hostname) {
    this.frobs.put(key, query);
}
现在,我将添加一些有用的日志记录

private void createBaz(String key, String databaseConfigKey, String query) {
    this.log.trace("createBaz(" + key + ", " + databaseConfigKey + ", " + query + ")");
    this.queries.put(key, query);
    this.databases.put(key, Database.forKey(databaseConfigKey));
}

private void createFrob(String key, String hostname) {
    this.log.trace("createFrob(" + key + ", " + hostname + ")");
    this.frobs.put(key, query);
}
请注意两个log.trace调用的相似之处

我已经打了很多这样的日志行,我已经厌倦了。我在找这样的东西:

private void createBaz(String key, String databaseConfigKey, String query) {
    doLogTrace();
    this.queries.put(key, query);
    this.databases.put(key, Database.forKey(databaseConfigKey));
}

private void createFrob(String key, String hostname) {
    doLogTrace();
    this.frobs.put(key, query);
}
我可能需要帮助完善我的问题

如果
doLogTrace()
恰好是一个较长的字符串,如
doLogTrace(这个,System.foo(),#$^#$&^$#)。它甚至可以是多行,只要在我使用它的任何地方都是相同的字符串。然后我就可以把这个字符串放到键盘宏中

我考虑过的事情

  • AspectJ不适用于此项目
  • IDE魔术。我可能可以为emacs编写一个宏,它可以跳到方法的顶部,复制名称和参数列表,下拉一行,粘贴并自动编辑到
    log.trace(“(“++[”,“++]”)中。。。但是,通常我的.java文件只在Eclipse中打开…:/
    
听起来像是你想要的


这里有一个很好的

从这篇文章中,您可以看到如何获得当前正在执行的方法的名称

这样,您还获得了each-method参数,因此创建一个新方法,该方法将获取其余参数(int…将允许您输入任意数量的int,您可以使用Object)

例如:

private void logTrace(Object ... args) {
    String methodName = stacktrace.methodName;
    String logmsg = methodName + "(";
    foreach(arg : args){
        logmsg+= arg + ", ";
    }
    logmsg+= ")";
    log(logmsg);
}
您可以使用Java为每个方法添加一些前后代码。好处是可以避免修改原始代码


如果您正在寻找更快速、更脏的解决方案,可以使用Thread.currentThread().getStackTrace()并只显示一个相关的帧(虽然它不会获得参数值)

您可以研究代码注入。我们用它来做一些事情。我还没有假装理解它。你能详细解释一下为什么AspectJ不合适吗?是面向方面的方法,特别是AspectJ有问题吗?@Gus,我对AspectJ一无所知。对于这个项目,我希望将代码保留为一种可以由同事(或临时工)轻松构建、修改和调试的形式,他们可能只有一个现成的Eclipse副本。而且,它是旧代码。@keshlam,我熟悉依赖注入。什么是代码注入?(我在web应用程序安全的上下文中很熟悉这个术语,但我认为您一定在谈论其他东西。)有一些适度标准化的系统运行在BCEL或ASM等工具之上,它们搜索代码模式并以标准方式修改它们。我见过一个系统,它自动将进入/退出消息添加到方法中,用于问题分析,并记录到异常处理程序中,以进行调试。我不知道我们使用的那个是否广泛可用,但“如果真的有,那一定是可能的。”我在这个问题上添加了与此相关的新评论;见上文。目前,我所在楼层的任何人都可以签出、构建、修改和重新部署这个项目,而不需要修改他们的开发环境。使用Guice会改变这一点吗?不,Guice更像是您使用的库。我相信可能有一种使用Guice的方法会妨碍轻松的工作区设置,但是如果您只是按照文档进行操作,您的开发流程应该不会有任何变化。我不熟悉
java.lang.reflect.Proxy
。我明白了,您建议我将现有类“包装”到代理中,以便在那里进行日志记录。顺便说一句,我怀疑这样做足够复杂,我会在过程中引入新的bug。。。所以,也许我真的在寻找一个“快速、肮脏”的解决方案你如何调用它?你能在不全部输入的情况下得到varargs吗?你可以查一下。您可以调用logTrace(“一”、“二”、“三”),那么logTrace中的args将是一个对象[3]。我相信它叫做变长参数列表。如果您正在寻找比这更自动化的东西,那么您可能希望研究java反射