1、新建切面类
package com.bxbank.ares.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
/**
- @program: ares
- @description: 切面类
- @author: zhaowencheng
- @create: 2019-09-16 21:04
**/
@Aspect
@Component
public class LogAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class);
/**
* 进入方法时间戳
*/
private Long startTime;
/**
* 方法结束时间戳(计时)
*/
private Long endTime;
//定义请求日志切点,指定路径
@Pointcut("execution(* com.bxbank.ares.controller.*Controller.*(..))")
public void logPointcut() {
}
/**
* 设置请求日志信息
*
* @param joinPoint
*/
@Before("logPointcut()")
public void doBefore(JoinPoint joinPoint) {
// 接收到请求,记录请求内容
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
//打印请求的内容
startTime = System.currentTimeMillis();
LOGGER.info("请求开始时间:{}" + LocalDateTime.now());
LOGGER.info("请求Url : {}" + request.getRequestURL().toString());
LOGGER.info("请求方式 : {}" + request.getMethod());
LOGGER.info("请求ip : {}" + request.getRemoteAddr());
LOGGER.info("请求方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
LOGGER.info("请求参数 : {}" + Arrays.toString(joinPoint.getArgs()));
}
/**
* 请求返回
*
* @param result
* @throws Throwable
*/
@AfterReturning(returning = "result", pointcut = "logPointcut()")
public void doAfterReturning(Object result) {
endTime = System.currentTimeMillis();
LOGGER.info("请求结束时间:{}" + LocalDateTime.now());
LOGGER.info("请求耗时:{}" + (endTime - startTime));
// 处理完请求,返回内容
LOGGER.info("请求返回 : {}" + result);
}
/**
* 异常
*
* @param throwable
*/
@AfterThrowing(value = "logPointcut()", throwing = "throwable")
public void doAfterThrowing(Throwable throwable) {
// 保存异常日志记录
LOGGER.error("发生异常时间:{}" + LocalDateTime.now());
LOGGER.error("抛出异常:{}" + throwable.getMessage());
}
}
2、在pom.xml文件中引入相关jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!-- 去掉spring-boot的默认log配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!-- 加上这个才能辨认到log4j2.yml文件 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
3、在log4j2.yml文件中配置日志输出格式
Configuration:
status: warn
monitorInterval: 30
Properties: # 定义全局变量
Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
#测试:-Dlog.level.console=warn -Dlog.level.xjj=trace
#生产:-Dlog.level.console=warn -Dlog.level.xjj=info
- name: log.level.console
value: debug
- name: log.sql.level
value: trace
#输出文件的路径
- name: LOG_HOME
value: /logs
Appenders:
Console: #输出到控制台
name: CONSOLE
target: SYSTEM_OUT
ThresholdFilter:
level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
onMatch: ACCEPT
onMismatch: DENY
PatternLayout: #输出日志的格式
pattern: “%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n”
RollingFile: # 输出到文件,超过128MB归档
- name: info
ignoreExceptions: false
fileName:
L
O
G
H
O
M
E
/
{LOG_HOME}/
LOGHOME/{date:yyyy-MM}/
d
a
t
e
:
y
y
y
y
−
M
M
−
d
d
/
i
n
f
o
.
l
o
g
f
i
l
e
P
a
t
t
e
r
n
:
"
{date:yyyy-MM-dd}/info.log filePattern: "
date:yyyy−MM−dd/info.logfilePattern:"{LOG_HOME}/${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz"
ThresholdFilter:
level: info
onMatch: ACCEPT
onMismatch: DENY
PatternLayout:
pattern: “%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n”
Policies:
SizeBasedTriggeringPolicy:
size: “128 MB”
DefaultRolloverStrategy:
max: 1000
- name: debug
ignoreExceptions: false
fileName: ${LOG_HOME}/${date:yyyy-MM}/${date:yyyy-MM-dd}/debug.log
filePattern: "${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz"
ThresholdFilter:
level: debug
onMatch: ACCEPT
onMismatch: DENY
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n"
Policies:
SizeBasedTriggeringPolicy:
size: "128 MB"
DefaultRolloverStrategy:
max: 1000
- name: error
ignoreExceptions: false
fileName: ${LOG_HOME}/${date:yyyy-MM}/${date:yyyy-MM-dd}/error.log
filePattern: "${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz"
ThresholdFilter:
level: error
onMatch: ACCEPT
onMismatch: DENY
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n"
Policies:
SizeBasedTriggeringPolicy:
size: "128 MB"
DefaultRolloverStrategy:
max: 1000
Loggers:
Root:
level: info
AppenderRef:
- ref: CONSOLE
- ref: info
- ref: debug
- ref: error
Logger: # 为com.xjj包配置特殊的Log级别,方便调试
- name: com.bxbank.ares.dao
additivity: false
level: ${sys:log.sql.level}
AppenderRef:
- ref: info
- ref: debug
- ref: error
- ref: CONSOLE
5、在application中读取log4j.yml文件
logging:
config: classpath:log4j2.yml
#启用切面
aop:
proxy-target-class: true
auto: true