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}, ...)")
其中:
将替换为“MyFunc”{method}
将被方法结果的{methodResult}
替换toString
将被{@x}
方法参数的x
替换toString
将被{@s}
方法参数的s
替换toString
将被{@y}
方法参数的y
替换toString
将被以下内容取代:“x:{methodArguments}
,s:{@x}
,y:{@s}
”“{@y}
,{@x}
,{@s}
”,{@y}
{@y},它们可以由布尔标志控制,如
includeArgumentName
我想谈谈性能问题。代码中可能包含大量的日志语句。在没有执行实际日志记录时(例如,由于日志级别限制),执行这些语句不得导致任何可见的性能损失。您考虑过吗?一些额外的细节在和中。这听起来像是一个典型的AOP问题。
Spring有一个相对容易使用的灵活解决方案,请参见。您能更具体地说吗?有什么东西或多或少已经准备好了,或者我必须实现大多数期望的逻辑吗?我添加了2个链接到其他实现了这一点的博客。看起来使用Spring和AOP来实现这一点是很常见的。我已经读到Spring比AspectJ慢得多。它会影响日志记录性能吗?请参阅我最后一分钟的文章编辑。Spring对此不是必需的,它不是AspectJ的要求,也不是AspectJ的替代品。第一个链接甚至不使用Spring。如果您非常关心性能,我会做的第一件事是将log4j与SLF4J和logback交换,然后确保使用这些库的性能特性,包括参数化日志记录。您能更具体一些吗?有什么东西或多或少已经准备好了,或者我必须实现大多数所需的逻辑吗?正如Ineradial在上面所评论的,Spring提供了一种用代理包装类的方法,代理可以在方法调用之前或之后执行操作。我确实建议您阅读我链接的整个页面,但您可以在示例部分或多或少地看到这是如何做到的。基本上,您为日志机制本身提供实现,然后通过提供一个选择相关案例的表达式(按类、方法签名或其他一些选项)连接调用机制。听起来像是在寻找AOP。它的全部目的是让您使用字节码的构建时/加载时插装来包装这样的方法调用。(但不确定是否可以访问方法参数名称。)不幸的是,我实际上只使用了Spring Framework的基于代理的AOP,它是为使用Spring构造而定制的,因此我没有一个现成的示例。