Invoke of a method - logging as method declaring class











up vote
0
down vote

favorite












I'm currently using JBoss interceptors and Proxy classes for wrapping method invoking at runtime and log some statistics.



So said, having this code:



public class ProxyLoggingInterceptor <T> implements InvocationHandler {

private Logger logger = LoggerFactory.getLogger(ProxyLoggingInterceptor.class);


@Override
public Object invoke(Object proxy, Method method, Object args) throws Throwable {
logger.info("%s.%s", t.getClass().getSimpleName(), method.getName());
}
}


the log will produce something like this:



12-11-2018 11:41.09,728 INFO (ProxyLoggingInterceptor) - [ANALYTICS]: MyClass.myMethod


However I'd like to show the logging declaring class as the logger entry, that is MyClass.
The desired result would be like:



12-11-2018 11:41.09,728 INFO (MyClass) - [ANALYTICS]: MyClass.myMethod


Is there any way that would not considered as a bad practice ?










share|improve this question


























    up vote
    0
    down vote

    favorite












    I'm currently using JBoss interceptors and Proxy classes for wrapping method invoking at runtime and log some statistics.



    So said, having this code:



    public class ProxyLoggingInterceptor <T> implements InvocationHandler {

    private Logger logger = LoggerFactory.getLogger(ProxyLoggingInterceptor.class);


    @Override
    public Object invoke(Object proxy, Method method, Object args) throws Throwable {
    logger.info("%s.%s", t.getClass().getSimpleName(), method.getName());
    }
    }


    the log will produce something like this:



    12-11-2018 11:41.09,728 INFO (ProxyLoggingInterceptor) - [ANALYTICS]: MyClass.myMethod


    However I'd like to show the logging declaring class as the logger entry, that is MyClass.
    The desired result would be like:



    12-11-2018 11:41.09,728 INFO (MyClass) - [ANALYTICS]: MyClass.myMethod


    Is there any way that would not considered as a bad practice ?










    share|improve this question
























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I'm currently using JBoss interceptors and Proxy classes for wrapping method invoking at runtime and log some statistics.



      So said, having this code:



      public class ProxyLoggingInterceptor <T> implements InvocationHandler {

      private Logger logger = LoggerFactory.getLogger(ProxyLoggingInterceptor.class);


      @Override
      public Object invoke(Object proxy, Method method, Object args) throws Throwable {
      logger.info("%s.%s", t.getClass().getSimpleName(), method.getName());
      }
      }


      the log will produce something like this:



      12-11-2018 11:41.09,728 INFO (ProxyLoggingInterceptor) - [ANALYTICS]: MyClass.myMethod


      However I'd like to show the logging declaring class as the logger entry, that is MyClass.
      The desired result would be like:



      12-11-2018 11:41.09,728 INFO (MyClass) - [ANALYTICS]: MyClass.myMethod


      Is there any way that would not considered as a bad practice ?










      share|improve this question













      I'm currently using JBoss interceptors and Proxy classes for wrapping method invoking at runtime and log some statistics.



      So said, having this code:



      public class ProxyLoggingInterceptor <T> implements InvocationHandler {

      private Logger logger = LoggerFactory.getLogger(ProxyLoggingInterceptor.class);


      @Override
      public Object invoke(Object proxy, Method method, Object args) throws Throwable {
      logger.info("%s.%s", t.getClass().getSimpleName(), method.getName());
      }
      }


      the log will produce something like this:



      12-11-2018 11:41.09,728 INFO (ProxyLoggingInterceptor) - [ANALYTICS]: MyClass.myMethod


      However I'd like to show the logging declaring class as the logger entry, that is MyClass.
      The desired result would be like:



      12-11-2018 11:41.09,728 INFO (MyClass) - [ANALYTICS]: MyClass.myMethod


      Is there any way that would not considered as a bad practice ?







      java logging aop






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 12 at 10:43









      Fabrizio Stellato

      575321




      575321
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          Actually I am not into AOP based on dynamic proxies, I always use AspectJ where this kind of problem does not exist and it is easy to get the information you want because the original classes get modified. But having found the question anyway due to its aop tag and having played around a bit, I am trying to answer it:



          package de.scrum_master.app;

          import java.lang.reflect.InvocationHandler;
          import java.lang.reflect.Method;
          import java.lang.reflect.Proxy;
          import java.util.Map;
          import java.util.function.Function;

          public class ProxyLoggingInterceptor<T> implements InvocationHandler {
          @Override
          public Object invoke(Object proxy, Method method, Object args) throws Throwable {
          System.out.printf(
          "%s.%s%n",
          proxy.getClass().getGenericInterfaces()[0].getTypeName(),
          method.getName()
          );
          return null;
          }

          public static void main(String args) {
          ClassLoader classLoader = ProxyLoggingInterceptor.class.getClassLoader();

          Map mapProxy = (Map) Proxy.newProxyInstance(
          classLoader,
          new Class { Map.class },
          new ProxyLoggingInterceptor<Map>()
          );
          mapProxy.put("foo", 11);

          Function functionProxy = (Function) Proxy.newProxyInstance(
          classLoader,
          new Class { Function.class },
          new ProxyLoggingInterceptor<Function>()
          );
          functionProxy.apply("x");

          Runnable runnableProxy = (Runnable) Proxy.newProxyInstance(
          classLoader,
          new Class { Runnable.class },
          new ProxyLoggingInterceptor<Runnable>()
          );
          runnableProxy.run();
          }
          }


          Console output:



          java.util.Map.put
          java.util.function.Function.apply
          java.lang.Runnable.run


          Is that what you want?






          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53260474%2finvoke-of-a-method-logging-as-method-declaring-class%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            Actually I am not into AOP based on dynamic proxies, I always use AspectJ where this kind of problem does not exist and it is easy to get the information you want because the original classes get modified. But having found the question anyway due to its aop tag and having played around a bit, I am trying to answer it:



            package de.scrum_master.app;

            import java.lang.reflect.InvocationHandler;
            import java.lang.reflect.Method;
            import java.lang.reflect.Proxy;
            import java.util.Map;
            import java.util.function.Function;

            public class ProxyLoggingInterceptor<T> implements InvocationHandler {
            @Override
            public Object invoke(Object proxy, Method method, Object args) throws Throwable {
            System.out.printf(
            "%s.%s%n",
            proxy.getClass().getGenericInterfaces()[0].getTypeName(),
            method.getName()
            );
            return null;
            }

            public static void main(String args) {
            ClassLoader classLoader = ProxyLoggingInterceptor.class.getClassLoader();

            Map mapProxy = (Map) Proxy.newProxyInstance(
            classLoader,
            new Class { Map.class },
            new ProxyLoggingInterceptor<Map>()
            );
            mapProxy.put("foo", 11);

            Function functionProxy = (Function) Proxy.newProxyInstance(
            classLoader,
            new Class { Function.class },
            new ProxyLoggingInterceptor<Function>()
            );
            functionProxy.apply("x");

            Runnable runnableProxy = (Runnable) Proxy.newProxyInstance(
            classLoader,
            new Class { Runnable.class },
            new ProxyLoggingInterceptor<Runnable>()
            );
            runnableProxy.run();
            }
            }


            Console output:



            java.util.Map.put
            java.util.function.Function.apply
            java.lang.Runnable.run


            Is that what you want?






            share|improve this answer

























              up vote
              0
              down vote













              Actually I am not into AOP based on dynamic proxies, I always use AspectJ where this kind of problem does not exist and it is easy to get the information you want because the original classes get modified. But having found the question anyway due to its aop tag and having played around a bit, I am trying to answer it:



              package de.scrum_master.app;

              import java.lang.reflect.InvocationHandler;
              import java.lang.reflect.Method;
              import java.lang.reflect.Proxy;
              import java.util.Map;
              import java.util.function.Function;

              public class ProxyLoggingInterceptor<T> implements InvocationHandler {
              @Override
              public Object invoke(Object proxy, Method method, Object args) throws Throwable {
              System.out.printf(
              "%s.%s%n",
              proxy.getClass().getGenericInterfaces()[0].getTypeName(),
              method.getName()
              );
              return null;
              }

              public static void main(String args) {
              ClassLoader classLoader = ProxyLoggingInterceptor.class.getClassLoader();

              Map mapProxy = (Map) Proxy.newProxyInstance(
              classLoader,
              new Class { Map.class },
              new ProxyLoggingInterceptor<Map>()
              );
              mapProxy.put("foo", 11);

              Function functionProxy = (Function) Proxy.newProxyInstance(
              classLoader,
              new Class { Function.class },
              new ProxyLoggingInterceptor<Function>()
              );
              functionProxy.apply("x");

              Runnable runnableProxy = (Runnable) Proxy.newProxyInstance(
              classLoader,
              new Class { Runnable.class },
              new ProxyLoggingInterceptor<Runnable>()
              );
              runnableProxy.run();
              }
              }


              Console output:



              java.util.Map.put
              java.util.function.Function.apply
              java.lang.Runnable.run


              Is that what you want?






              share|improve this answer























                up vote
                0
                down vote










                up vote
                0
                down vote









                Actually I am not into AOP based on dynamic proxies, I always use AspectJ where this kind of problem does not exist and it is easy to get the information you want because the original classes get modified. But having found the question anyway due to its aop tag and having played around a bit, I am trying to answer it:



                package de.scrum_master.app;

                import java.lang.reflect.InvocationHandler;
                import java.lang.reflect.Method;
                import java.lang.reflect.Proxy;
                import java.util.Map;
                import java.util.function.Function;

                public class ProxyLoggingInterceptor<T> implements InvocationHandler {
                @Override
                public Object invoke(Object proxy, Method method, Object args) throws Throwable {
                System.out.printf(
                "%s.%s%n",
                proxy.getClass().getGenericInterfaces()[0].getTypeName(),
                method.getName()
                );
                return null;
                }

                public static void main(String args) {
                ClassLoader classLoader = ProxyLoggingInterceptor.class.getClassLoader();

                Map mapProxy = (Map) Proxy.newProxyInstance(
                classLoader,
                new Class { Map.class },
                new ProxyLoggingInterceptor<Map>()
                );
                mapProxy.put("foo", 11);

                Function functionProxy = (Function) Proxy.newProxyInstance(
                classLoader,
                new Class { Function.class },
                new ProxyLoggingInterceptor<Function>()
                );
                functionProxy.apply("x");

                Runnable runnableProxy = (Runnable) Proxy.newProxyInstance(
                classLoader,
                new Class { Runnable.class },
                new ProxyLoggingInterceptor<Runnable>()
                );
                runnableProxy.run();
                }
                }


                Console output:



                java.util.Map.put
                java.util.function.Function.apply
                java.lang.Runnable.run


                Is that what you want?






                share|improve this answer












                Actually I am not into AOP based on dynamic proxies, I always use AspectJ where this kind of problem does not exist and it is easy to get the information you want because the original classes get modified. But having found the question anyway due to its aop tag and having played around a bit, I am trying to answer it:



                package de.scrum_master.app;

                import java.lang.reflect.InvocationHandler;
                import java.lang.reflect.Method;
                import java.lang.reflect.Proxy;
                import java.util.Map;
                import java.util.function.Function;

                public class ProxyLoggingInterceptor<T> implements InvocationHandler {
                @Override
                public Object invoke(Object proxy, Method method, Object args) throws Throwable {
                System.out.printf(
                "%s.%s%n",
                proxy.getClass().getGenericInterfaces()[0].getTypeName(),
                method.getName()
                );
                return null;
                }

                public static void main(String args) {
                ClassLoader classLoader = ProxyLoggingInterceptor.class.getClassLoader();

                Map mapProxy = (Map) Proxy.newProxyInstance(
                classLoader,
                new Class { Map.class },
                new ProxyLoggingInterceptor<Map>()
                );
                mapProxy.put("foo", 11);

                Function functionProxy = (Function) Proxy.newProxyInstance(
                classLoader,
                new Class { Function.class },
                new ProxyLoggingInterceptor<Function>()
                );
                functionProxy.apply("x");

                Runnable runnableProxy = (Runnable) Proxy.newProxyInstance(
                classLoader,
                new Class { Runnable.class },
                new ProxyLoggingInterceptor<Runnable>()
                );
                runnableProxy.run();
                }
                }


                Console output:



                java.util.Map.put
                java.util.function.Function.apply
                java.lang.Runnable.run


                Is that what you want?







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 10 at 2:28









                kriegaex

                30.5k36398




                30.5k36398






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53260474%2finvoke-of-a-method-logging-as-method-declaring-class%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Xamarin.iOS Cant Deploy on Iphone

                    Glorious Revolution

                    Dulmage-Mendelsohn matrix decomposition in Python