微服务 教程
1085个小节阅读:195.9k
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
我们在之前新闻搜索案例的基础上搭建项目:
日志生成的时机为:每次访问Controller接口都生成一条日志。
利用Spring的面向切面编程可以增强Controller的方法,使每次访问时都能创建一条日志对象写入文件。
添加AOP起步依赖
xxxxxxxxxx
<!-- aop起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
准备日志实体类
xxxxxxxxxx
public class Log {
private Integer id; // id
pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") (
private Date visitTime; // 访问时间
private int executionTime; // 访问时长
private String ip; // 访问者ip
private String url; // 访问路径
private String method; // 访问方法
private int level; // 日志等级 0:正常 1:警告 2:异常
private String message; // 异常信息
private String stackTrace;//异常栈信息
// 省略getter&setter
}
准备日志AOP类:
xxxxxxxxxx
public class LogAop {
private HttpServletRequest request;
// 切点为Controller层所有方法
"execution(* com.baizhan.estask.*.*Controller.*(..))") (
public void pointCut() {
}
"pointCut()") // 前置通知 (
public void before() {
// 记录访问时间
request.setAttribute("visitTime", new Date());
}
"pointCut()") // 后置通知 (
public void AfterReturning(JoinPoint joinPoint) {
Date visitTime = (Date) request.getAttribute("visitTime"); // 访问时间
long executionTime = new Date().getTime() - visitTime.getTime(); // 访问时长
String ip = request.getRemoteAddr(); // 访问ip
String url = request.getRequestURI();// 访问路径
String method = joinPoint.getSignature().getName();//访问方法名(切点方法)
int level = 0; // 日志等级
Log log = new Log();
log.setId(UUID.randomUUID().toString());
log.setMethod(method);
log.setExecutionTime(executionTime);
log.setUrl(url);
log.setIp(ip);
log.setLevel(level);
log.setVisitTime(visitTime);
printLog(log);
}
pointcut = "pointCut()", throwing = "ex") // 异常通知 (
public void afterThrowing(JoinPoint joinPoint, Throwable ex) {
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();// 访问路径
String method = joinPoint.getSignature().getName();//访问方法名(切点方法)
int level = 1;
String message = ex.getMessage(); // 异常信息
StringWriter sw = new StringWriter();
PrintWriter printWriter = new PrintWriter(sw);
ex.printStackTrace(printWriter);
String stackTrace = sw.toString(); // 异常栈信息
Log log = new Log();
log.setId(UUID.randomUUID().toString());
log.setMethod(method);
log.setExecutionTime(executionTime);
log.setUrl(url);
log.setIp(ip);
log.setLevel(level);
log.setVisitTime(visitTime);
log.setMessage(message);
log.setStackTrace(stackTrace);
printLog(log);
}
"${logPath}") (
private String logPath; // 日志文件路径
private ObjectMapper objectMapper = new ObjectMapper();
// 写日志到文件
public void printLog(Log log) {
try {
//改变输出方向,不输出到控制台,输出到指定文件
System.setOut(new PrintStream(new FileOutputStream(logPath,true)));
//将日志对象转为JSON格式,写入文件
System.out.println(objectMapper.writeValueAsString(log));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
配置文件配置log文件路径:
xxxxxxxxxx
spring
elasticsearch
rest
uris http //192.168.1.249200
logPath /usr/local/myAppLog.log
使用maven将项目打成jar包
使用rz命令将jar包上传至Linux虚拟机
运行项目
xxxxxxxxxx
java -jar estask-0.0.1-SNAPSHOT.jar
测试项目,看是否将日志写入文件