在生产中执行java ee应用程序的详细日志
我想知道是否有可能在生产中记录JavaEE应用程序方法中所有指令的执行情况。这应该提供属性值以及指令是否正确执行 我知道像glassfish这样的应用服务器提供的基本日志,但我想知道以前任何时候变量值的详细执行历史在生产中执行java ee应用程序的详细日志,java,jakarta-ee,jvm,Java,Jakarta Ee,Jvm,我想知道是否有可能在生产中记录JavaEE应用程序方法中所有指令的执行情况。这应该提供属性值以及指令是否正确执行 我知道像glassfish这样的应用服务器提供的基本日志,但我想知道以前任何时候变量值的详细执行历史 致以最诚挚的问候我认为面向方面编程(AOP)是您应该尝试的。如果您熟悉Spring框架,那么它有一组相当广泛的AOP特性 当我希望看到传入的参数时创建的一个示例(只是为了避免在Eclipse中调试的痛苦) 您可以阅读更多关于AOP的信息 另外,在我的示例中,我已经将值输出到标准输出。
致以最诚挚的问候我认为面向方面编程(AOP)是您应该尝试的。如果您熟悉Spring框架,那么它有一组相当广泛的AOP特性 当我希望看到传入的参数时创建的一个示例(只是为了避免在Eclipse中调试的痛苦) 您可以阅读更多关于AOP的信息
另外,在我的示例中,我已经将值输出到标准输出。您可能可以将其随时间一起输出到磁盘上的文件。拦截器轻松地涵盖了您所描述的内容,它是CDI支持的少数拦截器之一。它仍然基于AOP方法,与AspectJ的另一个答案类似。日志记录是说明这种拦截程序的一个示例,所以让我们考虑下面的<代码> MethodLogger < /C>
MethodLogger
。这是您将实际日志委托给的类。也就是在这个类中,您可以访问正在查找的信息(方法名称、执行完成情况、参数e.t.c.)
@Stateless
@Interceptors(MethodLogger.class) //apply this annotation to intercept every method call on this EJB
public class YourEJB{
@Interceptors(MethodLogger.class) // apply here if you want only a specific method to be tracked
public void doSomething();
@ExcludeClassInterceptors //apply this to stop the interceptor from affecting this method
public void doSomethingElse();
}
这需要……1<代码>这应该提供属性值以及指令是否正确执行。
:您是指方法参数还是属性
?2.您试图记录哪些JavaEE组件?我想问题很清楚,我想跟踪属性值和以前调用的方法。您是在寻找基于代码或基于配置的解决方案吗?@belkebir您可以使用此库J2EE中是否有其他解决方案?关于此解决方案,我还有另一个问题?是否可以看到已执行的指令?假设我们有一个if-else,我想看看if语句或else语句是否已经执行。有可能做到吗?我在J2EE上做得不多,所以我不能告诉您J2EE中的替代方案。至于if-else部分,我认为我们不能在AOP中也这样做。AOP包装了方法调用,因此它可以判断方法是否被调用,但不能判断方法内部发生了什么。如果if/else块调用其他方法,您可能能够推断出它们,但在这种情况下,这并不能真正帮助您。
public class MethodLogger{
private Logger logger = Logger.getLogger("com.you.MethodLogger");
@AroundInvoke
public Object logIt(InvocationContext iCtxt) throws Exception{
logger.entering(iCtxt.getTarget().toString(),iCtxt.getMethod().getName(),iCtxt.getParameters());
try{
return iCtxt.proceed(); //important! otherwise, method invocation doesn't continue
}
catch(Exception ex){
//do whatever you want whenever an exception occurs during this process
}
finally{
logger.exiting(iCtxt.getTarget().toString(),iCtxt.getMethod().getName());
}
}
}
@Stateless
@Interceptors(MethodLogger.class) //apply this annotation to intercept every method call on this EJB
public class YourEJB{
@Interceptors(MethodLogger.class) // apply here if you want only a specific method to be tracked
public void doSomething();
@ExcludeClassInterceptors //apply this to stop the interceptor from affecting this method
public void doSomethingElse();
}
<assembly-descriptor>
<interceptor-binding>
<ejb-name>*</ejb-name>
<interceptor-class>com.you.MethodLogger</interceptor-class>
</interceptor-binding>
</assembly-descriptor>