logback log4j 日志啥用?展示记录代码的运行情况。用于经验总结,对项目的分析和异常调错。
在项目中日志分为两种:
-
代码的日志,通过log4j logback等技术打印代码执行情况
-
业务的日志,记录的是用户的行为信息,用户在系统中什么时间什么地点执行了什么方法看了什么数据。通过对这些信息的记录,可以分析用户,得到用户的喜好,做智能推荐。
后台管理员 zhangsan 晚上10点 删除了一个上师
之前:在项目中引入 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
以业务层为例
日志打印的使用步骤(方法一):
- 开启要打印日志的包的 日志等级
- 在要打印日志的类中创建 日志对象
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 日志记录代码实现- 创建自定义注解
-
创建日志记录切面类
-
写日志记录的增强方法 确定增强类型
@After() public void logAfter(JoinPoint joinPoint){ CmfzLog cmfzLog = new CmfzLog(); // 获取日期 cmfzLog.setLogDate(new Date()); // 获取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不同的方法获取到的类型和内容不同 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); // 参数为 要获取的注解的类对象 LogAnnotation annotation = method.getAnnotation(LogAnnotation.class); cmfzLog.setLogType(annotation.type()); cmfzLog.setLogContent(annotation.value()); cmfzLogDao.insert(cmfzLog); } -
配置增强的切入点
需要在增强中获取自定义注解的值,意味着只能切有注解的方法,通过 切注解 的方式实现
- 在任何一个想要记录日志的方法上 加注解 就可以自动的记录日志



