Java 寻找一个轻量级但灵活的解决方案,用log4j记录方法的进入和退出(可能是异常)

Java 寻找一个轻量级但灵活的解决方案,用log4j记录方法的进入和退出(可能是异常),java,log4j,Java,Log4j,我需要一个轻量级的解决方案,它将使我能够记录方法入口和/或出口和/或异常。我希望能够配置: 进入/退出/异常日志级别。例如,我可能有退出的Debug级别,进入的Info级别和异常的Error级别 进入/退出/异常日志消息。日志消息应该允许我引用方法名称、方法参数和方法结果 以这种方法为例: public ObjectB MyFunc(int x, string s, ObjectA y) { // implementation } 然后,假设@Log是这样一个神奇的注释,那么在MyFu

我需要一个轻量级的解决方案,它将使我能够记录方法入口和/或出口和/或异常。我希望能够配置:

  • 进入/退出/异常日志级别。例如,我可能有退出的
    Debug
    级别,进入的
    Info
    级别和异常的
    Error
    级别
  • 进入/退出/异常日志消息。日志消息应该允许我引用方法名称、方法参数和方法结果
以这种方法为例:

public ObjectB MyFunc(int x, string s, ObjectA y)
{
  // implementation
}
然后,假设
@Log
是这样一个神奇的注释,那么在
MyFunc
方法上可以有任何
@Log
注释:

@Log                   // should be a reasonable default
@Log(EntryLevel = LogLevel.Info, ExitLevel = LogLevel.Debug) // makes sense to have  ExceptionLevel = LogLevel.Error by default
@Log(EntryText = "{method}({methodArguments}) = ?", ExitText = "{method} = {methodResult}")
@Log(EntryText = "{method}({@x}, {@s}, ...)")
其中:

  • {method}
    将替换为“MyFunc”
  • {methodResult}
    将被方法结果的
    toString
    替换
  • {@x}
    将被
    x
    方法参数的
    toString
    替换
  • {@s}
    将被
    s
    方法参数的
    toString
    替换
  • {@y}
    将被
    y
    方法参数的
    toString
    替换
  • {methodArguments}
    将被以下内容取代:“x:
    {@x}
    ,s:
    {@s}
    ,y:
    {@y}
    {@x}
    {@s}
    {@y}
    ”,
    {@y},它们可以由布尔标志控制,如
    includeArgumentName
作为记录,在.NET中,我们使用了一个修改过的(由我们)版本的Log4PostSharp库,它通过在编译阶段注入正确的字节码来完成上述所有工作。因此,我很清楚我在寻找什么,尽管我完全不知道如何在Java中实现它,也不知道是否已经完成了类似的工作

谢谢

编辑


我想谈谈性能问题。代码中可能包含大量的日志语句。在没有执行实际日志记录时(例如,由于日志级别限制),执行这些语句不得导致任何可见的性能损失。

您考虑过吗?一些额外的细节在和中。

这听起来像是一个典型的AOP问题。
Spring有一个相对容易使用的灵活解决方案,请参见。

您能更具体地说吗?有什么东西或多或少已经准备好了,或者我必须实现大多数期望的逻辑吗?我添加了2个链接到其他实现了这一点的博客。看起来使用Spring和AOP来实现这一点是很常见的。我已经读到Spring比AspectJ慢得多。它会影响日志记录性能吗?请参阅我最后一分钟的文章编辑。Spring对此不是必需的,它不是AspectJ的要求,也不是AspectJ的替代品。第一个链接甚至不使用Spring。如果您非常关心性能,我会做的第一件事是将log4j与SLF4J和logback交换,然后确保使用这些库的性能特性,包括参数化日志记录。您能更具体一些吗?有什么东西或多或少已经准备好了,或者我必须实现大多数所需的逻辑吗?正如Ineradial在上面所评论的,Spring提供了一种用代理包装类的方法,代理可以在方法调用之前或之后执行操作。我确实建议您阅读我链接的整个页面,但您可以在示例部分或多或少地看到这是如何做到的。基本上,您为日志机制本身提供实现,然后通过提供一个选择相关案例的表达式(按类、方法签名或其他一些选项)连接调用机制。听起来像是在寻找AOP。它的全部目的是让您使用字节码的构建时/加载时插装来包装这样的方法调用。(但不确定是否可以访问方法参数名称。)不幸的是,我实际上只使用了Spring Framework的基于代理的AOP,它是为使用Spring构造而定制的,因此我没有一个现成的示例。