啥是日志
logback log4j 日志啥用?展示记录代码的运行情况。用于经验总结,对项目的分析和异常调错。
在项目中日志分为两种:
-
代码的日志,通过log4j logback等技术打印代码执行情况
-
业务的日志,记录的是用户的行为信息,用户在系统中什么时间什么地点执行了什么方法看了什么数据。通过对这些信息的记录,可以分析用户,得到用户的喜好,做智能推荐。
后台管理员 zhangsan 晚上10点 删除了一个上师
SpringBoot项目中Logback日志的使用
SpringBoot Logback的配置
之前:在项目中引入 logback.xml
SpringBoot默认集成Logback,意味着在SpringBoot项目中使用logback 可以不要配置文件
-
如果有 删除 logback.xml
-
在application配置文件中写入日志的配置
日志等级:debug – info – warn – error
从低到高 等级越高打印信息越少
如果在 application 配置文件中有日志配置
并且在项目中还存在 logback.xml 项目在执行的时候 会以logback.xml中的配置为准
在自己的代码中打印日志
学习怎么打印自己代码的日志?例如:打印Controller代码的日志,打印业务层代码的日志?
日志打印的意义
在实际的开发中 用来取代打印语句 System.out.println("查询菜单数据");
打印语句的问题:
- 代码上线之后 调试用的打印语句 需要全部删除
- 怎么删除?手动注释 过了几天要在代码的基础上继续开发 调试代码需要打印语句 注释再开吗?
用到了日志打印
日志打印的优点:
- 信息全面
- 可以根据 日志等级配置 决定要打印哪些内容
- 开发的时候 使用debug
- 上线的之后 info --> error
以业务层为例
日志打印的使用步骤(方法一):
- 开启要打印日志的包的 日志等级
- 在要打印日志的类中创建 日志对象
/**
* 创建日志打印对象
*
* Logger LoggerFactory 都是 org.slf4j 包
* 参数为:当前类的类对象
*/
private Logger logger = LoggerFactory.getLogger(CmfzMenuServiceImpl.class);
- 在代码中使用日志对象 打印自己的日志信息
- 效果
**日志打印的使用步骤(方法二):**注解的方式
- 开启要打印日志的包的 日志等级
- 在要打印日志的类上加注解
- 在代码中直接使用日志打印
日志打印的细节处理:
- 打印对象类型 需要手动toString
- 占位符的使用
项目中管理员日志的记录
需求:记录管理员在后台项目的操作信息:谁 什么时间 什么地点 查看了什么数据 做了什么操作
1 确定要记录什么数据
CREATE TABLE `cmfz_log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`log_date` datetime DEFAULT NULL,
`log_ip` varchar(255) DEFAULT NULL,
`log_type` varchar(255) DEFAULT NULL,
`log_content` varchar(255) DEFAULT NULL,
PRIMARY KEY (`log_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2 确定什么技术来实现
- 在用户操作的时候 获取日志信息
- 把日志信息添加数据库
使用aop实现
注解式AOP
之前通过xml配置的方式
通过注解的方式【通过代码的方式 类似配置类】
实现aop的基本步骤
- 写增强
- 确定切入点
- 织入
注解式AOP的步骤
- 创建一个切面类
- 在类中创建一个增强方法 通过注解确定增强类型
- 在注解中配置切入点
重点:掌握常见aop注解
自定义注解
- 创建注解类
2. 配置注解的元注解
- 配置自定义注解的属性
重点:元注解
3 日志记录代码实现
- 创建自定义注解
-
创建日志记录切面类
-
写日志记录的增强方法 确定增强类型
/** * 日志增强 * 1. 获取日志数据 * 2. 日志数据添加数据库 */ @After() public void logAfter(JoinPoint joinPoint){ CmfzLog cmfzLog = new CmfzLog(); /** * 1.获取日志数据 */ // 获取日期 cmfzLog.setLogDate(new Date()); // 获取ip /** * RequestContextHolder 可以获取当前线程对应的请求 * * 一般情况下 ip获取会使用工具类 */ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); String ip = IPKit.getIpAddrByRequest(request); cmfzLog.setLogIp(ip); // 获取用户名 CmfzAdmin admin = (CmfzAdmin) request.getSession().getAttribute("admin"); if (admin == null){ cmfzLog.setUsername("root"); }else { cmfzLog.setUsername(admin.getUsername()); } // 操作类型和操作内容 aop不同的方法获取到的类型和内容不同 /** * 通过joinPoint可以获取切入点附近所有的信息 类 方法 属性 注解 等等 * * 获取当前被切方法的日志注解 * 1 通过连接点对象joinPoint获取 方法签名对象 * 2 通过方法签名对象获取被切的方法 * 3 通过方法对象获取方法上的注解 * 4 获取注解中的值 */ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); // 参数为 要获取的注解的类对象 LogAnnotation annotation = method.getAnnotation(LogAnnotation.class); cmfzLog.setLogType(annotation.type()); cmfzLog.setLogContent(annotation.value()); /** * 2.日志数据添加数据库 */ cmfzLogDao.insert(cmfzLog); }
-
配置增强的切入点
需要在增强中获取自定义注解的值,意味着只能切有注解的方法,通过 切注解 的方式实现
- 在任何一个想要记录日志的方法上 加注解 就可以自动的记录日志