Bird
Raised Fist0
Spring Bootframework~5 mins

AOP for logging in Spring Boot

Choose your learning style10 modes available
Introduction

AOP helps add logging to your app without changing your main code. It keeps your code clean and easy to read.

You want to track when methods start and finish in your app.
You need to log errors automatically without adding code everywhere.
You want to measure how long certain actions take.
You want to keep your business logic separate from logging details.
Syntax
Spring Boot
@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example..*(..))")
    public void logBefore(JoinPoint joinPoint) {
        // logging code here
    }

    @AfterReturning(pointcut = "execution(* com.example..*(..))", returning = "result")
    public void logAfter(JoinPoint joinPoint, Object result) {
        // logging code here
    }
}

@Aspect marks the class as an aspect for AOP.

@Before runs code before matched methods; @AfterReturning runs after methods return.

Examples
This logs the start of any method in the service package.
Spring Boot
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
    System.out.println("Starting: " + joinPoint.getSignature().getName());
}
This logs the end of controller methods and shows what they returned.
Spring Boot
@AfterReturning(pointcut = "execution(* com.example.controller.*.*(..))", returning = "result")
public void logAfterMethod(JoinPoint joinPoint, Object result) {
    System.out.println("Finished: " + joinPoint.getSignature().getName() + ", returned: " + result);
}
Sample Program

This Spring Boot app uses AOP to log before and after the add method in CalculatorService. The logs show method start, finish, and return value.

Spring Boot
package com.example.aoplogging;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.aoplogging.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("[LOG] Starting method: " + joinPoint.getSignature().getName());
    }

    @AfterReturning(pointcut = "execution(* com.example.aoplogging.service.*.*(..))", returning = "result")
    public void logAfter(JoinPoint joinPoint, Object result) {
        System.out.println("[LOG] Finished method: " + joinPoint.getSignature().getName() + ", returned: " + result);
    }
}

package com.example.aoplogging.service;

import org.springframework.stereotype.Service;

@Service
public class CalculatorService {
    public int add(int a, int b) {
        return a + b;
    }
}

package com.example.aoplogging;

import com.example.aoplogging.service.CalculatorService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy
public class AopLoggingApplication {

    public static void main(String[] args) {
        SpringApplication.run(AopLoggingApplication.class, args);
    }

    @Bean
    public CommandLineRunner run(CalculatorService calculatorService) {
        return args -> {
            int result = calculatorService.add(5, 3);
            System.out.println("Result: " + result);
        };
    }
}
OutputSuccess
Important Notes

Make sure to add @EnableAspectJAutoProxy in your Spring Boot main class or config.

Use pointcut expressions carefully to target only the methods you want to log.

Logging too much can slow your app, so log only important methods.

Summary

AOP lets you add logging without changing your main code.

Use @Before and @AfterReturning to log method start and end.

Keep your code clean and separate from logging details.

Practice

(1/5)
1. What is the main purpose of using AOP (Aspect-Oriented Programming) for logging in Spring Boot?
easy
A. To write logging code inside every method manually
B. To replace all existing logging frameworks
C. To add logging without changing the main business code
D. To disable logging for all methods automatically

Solution

  1. Step 1: Understand AOP's role in logging

    AOP allows adding extra behavior like logging without modifying the main code logic.
  2. Step 2: Identify the benefit of separation

    By using AOP, logging code is kept separate, making the main code cleaner and easier to maintain.
  3. Final Answer:

    To add logging without changing the main business code -> Option C
  4. Quick Check:

    AOP adds logging cleanly = A [OK]
Hint: AOP separates logging from business code [OK]
Common Mistakes:
  • Thinking AOP replaces logging frameworks
  • Believing logging must be written inside each method
  • Assuming AOP disables logging automatically
2. Which annotation is used in Spring AOP to execute code before a method runs for logging purposes?
easy
A. @AfterReturning
B. @AfterThrowing
C. @Around
D. @Before

Solution

  1. Step 1: Recall Spring AOP annotations

    @Before runs advice before the target method executes, perfect for logging method start.
  2. Step 2: Differentiate from other annotations

    @AfterReturning runs after method success, @Around wraps method, @AfterThrowing runs on exceptions.
  3. Final Answer:

    @Before -> Option D
  4. Quick Check:

    Log before method = @Before [OK]
Hint: Use @Before to log method start [OK]
Common Mistakes:
  • Confusing @Before with @AfterReturning
  • Using @AfterThrowing for normal logging
  • Thinking @Around is only for exceptions
3. Given this Spring AOP advice snippet, what will be logged when processOrder() method completes successfully?
@Before("execution(* com.example.service.*.*(..))")
public void logStart() {
    System.out.println("Method started");
}

@AfterReturning("execution(* com.example.service.*.*(..))")
public void logEnd() {
    System.out.println("Method completed");
}
medium
A. Method started and Method completed
B. Method completed only
C. Method started only
D. No output logged

Solution

  1. Step 1: Analyze @Before advice

    Before processOrder() runs, "Method started" is printed.
  2. Step 2: Analyze @AfterReturning advice

    After successful completion, "Method completed" is printed.
  3. Final Answer:

    Method started and Method completed -> Option A
  4. Quick Check:

    Before + AfterReturning logs both messages [OK]
Hint: Both @Before and @AfterReturning run on success [OK]
Common Mistakes:
  • Thinking only one advice runs
  • Confusing @AfterReturning with @AfterThrowing
  • Assuming no logs if method returns void
4. Identify the error in this Spring AOP logging advice code:
@Before("execution(* com.example..*(..))")
public void logStart() {
    System.out.println("Starting method");
}

@AfterReturning("execution(* com.example.service.*.*(..))")
public void logEnd() {
    System.out.println("Method ended");
}
medium
A. The pointcut expressions target different packages
B. The method signatures lack return types
C. The @AfterReturning advice is missing a returning attribute
D. The pointcut expression in @Before is invalid

Solution

  1. Step 1: Check pointcut expressions

    @Before targets "com.example..*" (all subpackages), @AfterReturning targets only "com.example.service.*".
  2. Step 2: Understand mismatch impact

    This mismatch means @Before runs on more methods than @AfterReturning, causing inconsistent logging.
  3. Final Answer:

    The pointcut expressions target different packages -> Option A
  4. Quick Check:

    Pointcut mismatch = A [OK]
Hint: Match pointcut packages exactly for consistent logging [OK]
Common Mistakes:
  • Assuming pointcut syntax is wrong
  • Thinking return type is required in advice methods
  • Believing @AfterReturning must have returning attribute always
5. You want to log method entry, exit, and exceptions for all service methods in package com.example.service. Which combination of Spring AOP advice annotations should you use?
hard
A. @AfterThrowing only
B. @Before, @AfterReturning, and @AfterThrowing
C. @Around only
D. @Before and @AfterReturning only

Solution

  1. Step 1: Identify logging needs

    Entry logging requires @Before, exit logging requires @AfterReturning, exception logging requires @AfterThrowing.
  2. Step 2: Confirm combined advice usage

    Using all three annotations covers all cases: start, successful end, and exceptions.
  3. Final Answer:

    @Before, @AfterReturning, and @AfterThrowing -> Option B
  4. Quick Check:

    All logging cases need these three advices [OK]
Hint: Use all three advices for full logging coverage [OK]
Common Mistakes:
  • Using only @Before and @AfterReturning misses exceptions
  • Thinking @Around alone is simpler for all cases
  • Ignoring exception logging with @AfterThrowing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard