Spring MVC Log4j – Ghi log trong Spring MVC với Spring AOP, AspectJ, Log4j
1. Spring MVC + Log4j
Spring MVC Log4j – Ghi log trong Spring MVC với Spring AOP, AspectJ, Log4j. Code ví dụ Log4j với Spring MVC, kết hợp với AOP + AspectJ
Xem lại về Log4j: https://stackjava.com/library/apache-log4j.html
Thư viện sử dung:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>stackjava.com</groupId>
<artifactId>SpringMVC-Log4j</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
File Controller
package stackjava.com.springmvchello.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
private static final Logger logger = Logger.getLogger(HelloController.class);
@RequestMapping("/")
public String index() {
logger.debug("debug log");
logger.error("error log");
logger.info("info log");
return "index";
}
}
File config log4j
## Show error log + info log + debug log to console
log4j.rootLogger= DEBUG, stdout
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c{1}: %C %M - %m%n
<html> <head> <title>index</title> </head> <body> <h1>Spring MVC Log4j!</h1> </body> </html>
Kết quả:
2. Spring MVC + AOP + AspectJ + Log4j
Xem lại về Spring AOP: https://stackjava.com/spring/spring-aop-1.html
Xem lại về Spring AOP + AspectJ: https://stackjava.com/spring/spring-core-aop-aspectj.html
Thư viện sử dụng:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>stackjava.com</groupId>
<artifactId>SpringMVCHello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
File controller
package stackjava.com.springmvchello.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/")
public String index() {
return "index";
}
@RequestMapping("/error")
public String error() throws Exception {
throw new Exception("testing");
}
}
File thực hiện ghi log:
package stackjava.com.springmvchello.logger;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class LoggerAspectJ {
private static final Logger logger = Logger.getLogger(LoggerAspectJ.class);
@Before("execution(* stackjava.com.springmvchello.controller.HelloController.*(..))")
public void logBefore(JoinPoint joinPoint) {
logger.info("before method: " + joinPoint.getSignature().getName());
}
@After("execution(* stackjava.com.springmvchello.controller.HelloController.*(..))")
public void logAfter(JoinPoint joinPoint) {
logger.info("after method: " + joinPoint.getSignature().getName());
}
@AfterReturning(pointcut = "execution(* stackjava.com.springmvchello.controller.HelloController.*(..))",
returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
logger.info("after return method : " + joinPoint.getSignature().getName());
logger.info("Method returned value is : " + result);
}
@AfterThrowing(pointcut = "execution(* stackjava.com.springmvchello.controller.HelloController.*(..))",
throwing = "error")
public void logThrow(JoinPoint joinPoint, Throwable error) {
logger.info("exception in method: " + joinPoint.getSignature().getName());
logger.error("Exception is: " + error);
}
}
File config log4j:
## Show error log + info log + debug log to console
log4j.rootLogger= DEBUG, stdout
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c{1}: %C %M - %m%n
File view:
<html> <head> <title>index</title> </head> <body> <h1>Spring MVC Log4j + AspectJ!</h1> <a href="error">/error</a> </body> </html>
Demo:
Kết quả log cho method index()
Kết quả log cho method error() (/error)
Okay, done!
Download code ví dụ trên tại đây: SpringMVC-Log4j | SpringMVC-Log4j-AspectJ
References:
https://docs.spring.io/spring/docs/current/spring-framework-reference
Spring MVC Log4j – Ghi log với Log4j, Spring AOP + AspectJ + Log4j