Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在生产中执行java ee应用程序的详细日志_Java_Jakarta Ee_Jvm - Fatal编程技术网

在生产中执行java ee应用程序的详细日志

在生产中执行java ee应用程序的详细日志,java,jakarta-ee,jvm,Java,Jakarta Ee,Jvm,我想知道是否有可能在生产中记录JavaEE应用程序方法中所有指令的执行情况。这应该提供属性值以及指令是否正确执行 我知道像glassfish这样的应用服务器提供的基本日志,但我想知道以前任何时候变量值的详细执行历史 致以最诚挚的问候我认为面向方面编程(AOP)是您应该尝试的。如果您熟悉Spring框架,那么它有一组相当广泛的AOP特性 当我希望看到传入的参数时创建的一个示例(只是为了避免在Eclipse中调试的痛苦) 您可以阅读更多关于AOP的信息 另外,在我的示例中,我已经将值输出到标准输出。

我想知道是否有可能在生产中记录JavaEE应用程序方法中所有指令的执行情况。这应该提供属性值以及指令是否正确执行

我知道像glassfish这样的应用服务器提供的基本日志,但我想知道以前任何时候变量值的详细执行历史


致以最诚挚的问候

我认为面向方面编程(AOP)是您应该尝试的。如果您熟悉Spring框架,那么它有一组相当广泛的AOP特性

当我希望看到传入的参数时创建的一个示例(只是为了避免在Eclipse中调试的痛苦)

您可以阅读更多关于AOP的信息


另外,在我的示例中,我已经将值输出到标准输出。您可能可以将其随时间一起输出到磁盘上的文件。

拦截器轻松地涵盖了您所描述的内容,它是CDI支持的少数拦截器之一。它仍然基于AOP方法,与AspectJ的另一个答案类似。日志记录是说明这种拦截程序的一个示例,所以让我们考虑下面的<代码> MethodLogger < /C>
  • 定义一个类
    MethodLogger
    。这是您将实际日志委托给的类。也就是在这个类中,您可以访问正在查找的信息(方法名称、执行完成情况、参数e.t.c.)

  • 将拦截器应用于EJB

    @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();
    
    
    }
    
  • 在EJB3.1中,您还可以选择指定全局拦截器。这样定义的拦截器将应用于应用程序中的所有EJB,而不考虑注释的使用。因此,在ejb-jar.xml中:

    
    
    这需要……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>