Detailed Request and response logging for SpringBoot












2















Ruby on Rails provides default logging for "Request", "Response" objects in the controller as well as the time taken etc. Is there a way in which we can accomplish the same in case of Spring Boot without having to write the log statements to print request, response and time taken etc.



PS : Python's Flask has something like Before and After annotations, but I m not sure how we can accomplish Rich Rails like logging in Spring Boot.










share|improve this question

























  • In my concern no, but you can use AOP Aspect Oriented Programming to logging before and after generically on the methods that you consider.

    – Jonathan Johx
    Jan 2 at 18:02
















2















Ruby on Rails provides default logging for "Request", "Response" objects in the controller as well as the time taken etc. Is there a way in which we can accomplish the same in case of Spring Boot without having to write the log statements to print request, response and time taken etc.



PS : Python's Flask has something like Before and After annotations, but I m not sure how we can accomplish Rich Rails like logging in Spring Boot.










share|improve this question

























  • In my concern no, but you can use AOP Aspect Oriented Programming to logging before and after generically on the methods that you consider.

    – Jonathan Johx
    Jan 2 at 18:02














2












2








2








Ruby on Rails provides default logging for "Request", "Response" objects in the controller as well as the time taken etc. Is there a way in which we can accomplish the same in case of Spring Boot without having to write the log statements to print request, response and time taken etc.



PS : Python's Flask has something like Before and After annotations, but I m not sure how we can accomplish Rich Rails like logging in Spring Boot.










share|improve this question
















Ruby on Rails provides default logging for "Request", "Response" objects in the controller as well as the time taken etc. Is there a way in which we can accomplish the same in case of Spring Boot without having to write the log statements to print request, response and time taken etc.



PS : Python's Flask has something like Before and After annotations, but I m not sure how we can accomplish Rich Rails like logging in Spring Boot.







spring-boot logging






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 4 at 20:59









phoet

17.3k33968




17.3k33968










asked Jan 2 at 17:18









VineelVineel

45531030




45531030













  • In my concern no, but you can use AOP Aspect Oriented Programming to logging before and after generically on the methods that you consider.

    – Jonathan Johx
    Jan 2 at 18:02



















  • In my concern no, but you can use AOP Aspect Oriented Programming to logging before and after generically on the methods that you consider.

    – Jonathan Johx
    Jan 2 at 18:02

















In my concern no, but you can use AOP Aspect Oriented Programming to logging before and after generically on the methods that you consider.

– Jonathan Johx
Jan 2 at 18:02





In my concern no, but you can use AOP Aspect Oriented Programming to logging before and after generically on the methods that you consider.

– Jonathan Johx
Jan 2 at 18:02












2 Answers
2






active

oldest

votes


















1














How about something like this?



@Configuration
public class ApplicationConfig extends WebMvcConfigurerAdapter {

@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new ControllerInterceptor()).addPathPatterns(ControllerInterceptor.PATTERN);
}

public class ControllerInterceptor extends HandlerInterceptorAdapter {

public static final String PATTERN = "/mycontrollermappingvalue*";

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Before request");
//log values from HttpServletRequest
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("After request");
//log values from HttpServletResponse
}
}





share|improve this answer































    -1














    I think you are looking for Java Aspect Oriented Programming. Take a look at this example.



    Here is an example of the config entry that ends up logging method calls.



    <aop:config> 
    <aop:aspect id="aspectService" ref="logAspect" >
    <aop:pointcut id="pointCutBeforeBC"
    expression="execution(* com.test.application.service.*.*(..))" />
    <aop:before method="logBefore" pointcut-ref="pointCutBefore" />
    </aop:aspect>

    <aop:aspect id="aspectUserInterface" ref="logAspect" >
    <aop:pointcut id="pointCutBeforeUserInterfaceBA"
    expression="execution(* com.test.application.ui.*(..))" />
    <aop:before method="pointCutBeforeTraceInput" pointcut-ref="pointCutBeforeUserInterface" />
    <aop:after-throwing method="pointCutAfterThrowingOutput" throwing="_Throwable" pointcut-ref="pointCutBeforeUserInterface" />


    </aop:aspect>
    </aop:config>





    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%2f54010547%2fdetailed-request-and-response-logging-for-springboot%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      How about something like this?



      @Configuration
      public class ApplicationConfig extends WebMvcConfigurerAdapter {

      @Override
      public void addInterceptors(InterceptorRegistry registry){
      registry.addInterceptor(new ControllerInterceptor()).addPathPatterns(ControllerInterceptor.PATTERN);
      }

      public class ControllerInterceptor extends HandlerInterceptorAdapter {

      public static final String PATTERN = "/mycontrollermappingvalue*";

      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
      System.out.println("Before request");
      //log values from HttpServletRequest
      return true;
      }

      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
      ModelAndView modelAndView) throws Exception {
      System.out.println("After request");
      //log values from HttpServletResponse
      }
      }





      share|improve this answer




























        1














        How about something like this?



        @Configuration
        public class ApplicationConfig extends WebMvcConfigurerAdapter {

        @Override
        public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new ControllerInterceptor()).addPathPatterns(ControllerInterceptor.PATTERN);
        }

        public class ControllerInterceptor extends HandlerInterceptorAdapter {

        public static final String PATTERN = "/mycontrollermappingvalue*";

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        System.out.println("Before request");
        //log values from HttpServletRequest
        return true;
        }

        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
        System.out.println("After request");
        //log values from HttpServletResponse
        }
        }





        share|improve this answer


























          1












          1








          1







          How about something like this?



          @Configuration
          public class ApplicationConfig extends WebMvcConfigurerAdapter {

          @Override
          public void addInterceptors(InterceptorRegistry registry){
          registry.addInterceptor(new ControllerInterceptor()).addPathPatterns(ControllerInterceptor.PATTERN);
          }

          public class ControllerInterceptor extends HandlerInterceptorAdapter {

          public static final String PATTERN = "/mycontrollermappingvalue*";

          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
          throws Exception {
          System.out.println("Before request");
          //log values from HttpServletRequest
          return true;
          }

          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
          ModelAndView modelAndView) throws Exception {
          System.out.println("After request");
          //log values from HttpServletResponse
          }
          }





          share|improve this answer













          How about something like this?



          @Configuration
          public class ApplicationConfig extends WebMvcConfigurerAdapter {

          @Override
          public void addInterceptors(InterceptorRegistry registry){
          registry.addInterceptor(new ControllerInterceptor()).addPathPatterns(ControllerInterceptor.PATTERN);
          }

          public class ControllerInterceptor extends HandlerInterceptorAdapter {

          public static final String PATTERN = "/mycontrollermappingvalue*";

          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
          throws Exception {
          System.out.println("Before request");
          //log values from HttpServletRequest
          return true;
          }

          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
          ModelAndView modelAndView) throws Exception {
          System.out.println("After request");
          //log values from HttpServletResponse
          }
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Jan 8 at 11:47









          jbwtjbwt

          126311




          126311

























              -1














              I think you are looking for Java Aspect Oriented Programming. Take a look at this example.



              Here is an example of the config entry that ends up logging method calls.



              <aop:config> 
              <aop:aspect id="aspectService" ref="logAspect" >
              <aop:pointcut id="pointCutBeforeBC"
              expression="execution(* com.test.application.service.*.*(..))" />
              <aop:before method="logBefore" pointcut-ref="pointCutBefore" />
              </aop:aspect>

              <aop:aspect id="aspectUserInterface" ref="logAspect" >
              <aop:pointcut id="pointCutBeforeUserInterfaceBA"
              expression="execution(* com.test.application.ui.*(..))" />
              <aop:before method="pointCutBeforeTraceInput" pointcut-ref="pointCutBeforeUserInterface" />
              <aop:after-throwing method="pointCutAfterThrowingOutput" throwing="_Throwable" pointcut-ref="pointCutBeforeUserInterface" />


              </aop:aspect>
              </aop:config>





              share|improve this answer




























                -1














                I think you are looking for Java Aspect Oriented Programming. Take a look at this example.



                Here is an example of the config entry that ends up logging method calls.



                <aop:config> 
                <aop:aspect id="aspectService" ref="logAspect" >
                <aop:pointcut id="pointCutBeforeBC"
                expression="execution(* com.test.application.service.*.*(..))" />
                <aop:before method="logBefore" pointcut-ref="pointCutBefore" />
                </aop:aspect>

                <aop:aspect id="aspectUserInterface" ref="logAspect" >
                <aop:pointcut id="pointCutBeforeUserInterfaceBA"
                expression="execution(* com.test.application.ui.*(..))" />
                <aop:before method="pointCutBeforeTraceInput" pointcut-ref="pointCutBeforeUserInterface" />
                <aop:after-throwing method="pointCutAfterThrowingOutput" throwing="_Throwable" pointcut-ref="pointCutBeforeUserInterface" />


                </aop:aspect>
                </aop:config>





                share|improve this answer


























                  -1












                  -1








                  -1







                  I think you are looking for Java Aspect Oriented Programming. Take a look at this example.



                  Here is an example of the config entry that ends up logging method calls.



                  <aop:config> 
                  <aop:aspect id="aspectService" ref="logAspect" >
                  <aop:pointcut id="pointCutBeforeBC"
                  expression="execution(* com.test.application.service.*.*(..))" />
                  <aop:before method="logBefore" pointcut-ref="pointCutBefore" />
                  </aop:aspect>

                  <aop:aspect id="aspectUserInterface" ref="logAspect" >
                  <aop:pointcut id="pointCutBeforeUserInterfaceBA"
                  expression="execution(* com.test.application.ui.*(..))" />
                  <aop:before method="pointCutBeforeTraceInput" pointcut-ref="pointCutBeforeUserInterface" />
                  <aop:after-throwing method="pointCutAfterThrowingOutput" throwing="_Throwable" pointcut-ref="pointCutBeforeUserInterface" />


                  </aop:aspect>
                  </aop:config>





                  share|improve this answer













                  I think you are looking for Java Aspect Oriented Programming. Take a look at this example.



                  Here is an example of the config entry that ends up logging method calls.



                  <aop:config> 
                  <aop:aspect id="aspectService" ref="logAspect" >
                  <aop:pointcut id="pointCutBeforeBC"
                  expression="execution(* com.test.application.service.*.*(..))" />
                  <aop:before method="logBefore" pointcut-ref="pointCutBefore" />
                  </aop:aspect>

                  <aop:aspect id="aspectUserInterface" ref="logAspect" >
                  <aop:pointcut id="pointCutBeforeUserInterfaceBA"
                  expression="execution(* com.test.application.ui.*(..))" />
                  <aop:before method="pointCutBeforeTraceInput" pointcut-ref="pointCutBeforeUserInterface" />
                  <aop:after-throwing method="pointCutAfterThrowingOutput" throwing="_Throwable" pointcut-ref="pointCutBeforeUserInterface" />


                  </aop:aspect>
                  </aop:config>






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Jan 4 at 21:50









                  Mr SmithMr Smith

                  1,61073259




                  1,61073259






























                      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.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54010547%2fdetailed-request-and-response-logging-for-springboot%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

                      Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

                      Does disintegrating a polymorphed enemy still kill it after the 2018 errata?

                      A Topological Invariant for $pi_3(U(n))$