微服务 教程
1085个小节阅读:196.1k
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在后台代码运行的过程中,我们要对每一次操作进行日志记录,一方面通过日志可以发现代码的缺陷,另一方面可以追踪内部人员的操作记录。
SpringBoot默认使用Logback组件作为日志管理,首先在/resources
下添加Logback配置文件logback.xml
xxxxxxxxxx
<configuration>
<!--定义日志文件的存储地址-->
<property name="LOG_HOME" value="${catalina.base}/logs/"/>
<!-- 控制台输出 -->
<appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/server.%d{yy99-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="Stdout"/>
<appender-ref ref="RollingFile"/>
</root>
</configuration>
此时我们可以在代码中使用Logger对象打印日志,但如果每个方法都添加日志打印的代码,需要维护大量代码,最好的方式是使用AOP技术,将所有的控制器方法作为切点,在方法执行完成后自动执行打印日志的代码。
编写日志实体类
xxxxxxxxxx
public class Log {
private String url; // 访问的路径
private Date visitTime; // 访问时间
private String username; // 访问者
private String ip; // 访问ip
private int executionTime; // 访问时长
private String exceptionMessage; // 异常信息
}
在pom中添加AOP依赖
xxxxxxxxxx
<!-- AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
编写日志AOP类
xxxxxxxxxx
public class LogAop {
private HttpServletRequest request;
private final static Logger logger = LoggerFactory.getLogger(LogAop.class);
"execution(* com.itbaizhan.travel.controller.backstage.*.*(..))") (
public void pointCut(){}
"pointCut()") (
public void doBefore(JoinPoint joinPoint) {
// 记录访问时间
Date date = new Date();
request.setAttribute("visitTime",date);
}
"pointCut()") (
public void doAfter(){
Log log = new Log();
Date visitTime = (Date) request.getAttribute("visitTime"); // 访问时间
Date now = new Date();
int executionTime = (int)(now.getTime() - visitTime.getTime()); // 访问时长
String ip = request.getRemoteAddr(); // 访问ip
String url = request.getRequestURI();// 访问路径
// 拿到security中的User对象
Object user = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (user instanceof User){
String username = ((User)user).getUsername();
log.setUsername(username);
}
log.setExecutionTime(executionTime);
log.setUrl(url);
log.setIp(ip);
log.setVisitTime(visitTime);
logger.info(log.toString());
}
pointcut = "pointCut()",throwing = "ex") (
public void afterThrowing(Throwable ex){
Log log = new Log();
Date visitTime = (Date) request.getAttribute("visitTime"); // 访问时间
Date now = new Date();
int executionTime = (int) (now.getTime() - visitTime.getTime()); // 访问时长
String ip = request.getRemoteAddr(); // 访问ip
String url = request.getRequestURI(); // 访问路径
// 拿到Security中的User对象
Object user = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (user instanceof User){
String username = ((User) user).getUsername();
log.setUsername(username);
}
log.setExecutionTime(executionTime);
log.setUrl(url);
log.setIp(ip);
log.setVisitTime(visitTime);
// 异常信息
String exMessage = ex.getMessage();
log.setExceptionMessage(exMessage);
logger.info(log.toString());
}
}
测试日志记录功能