Spring Boot 入门(五):集成 AOP 进行日志管理

本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页查询,Generator 代码自动生成器,Shiro登录及权限管理。本篇博客主要是集成 AOP 进行日志管理

1.导入 jar 包

1 <!-- aop -->
2         <dependency>
3             <groupId>org.springframework.boot</groupId>
4             <artifactId>spring-boot-starter-aop</artifactId>
5         </dependency>

2.配置 Logback-spring 文件

关于 Logback-spring 的配置网上很多,随便copy一份基本上就能使用,Logback-spring.xml 中主要配置了下列内容

  • (1).日志写道控制台
  • (2).日志写道本地文件中
  • (3).日志级别
  • (4).日志生成方式(按照日期滚动生成,还是按照日期单独生成)
  • (5).日志来源的配置,一般直接配置到 Control

我也是直接在copy了一份,代码如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration  scan="true" scanPeriod="60 seconds" debug="false">
 3     <contextName>logback</contextName>
 4 <!--
 5     &lt;!&ndash; 文件输出格式 &ndash;&gt;
 6     <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" />
 7     &lt;!&ndash; test文件路径 &ndash;&gt;
 8     <property name="TEST_FILE_PATH" value="c:/log" />
 9
10     -->
11
12     <!--输出到控制台-->
13     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
14         <encoder>
15             <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
16         </encoder>
17     </appender>
18
19     <!--按天生成日志-->
20     <appender name="logFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">
21         <Prudent>true</Prudent>
22         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
23             <FileNamePattern>
24                 applog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
25             </FileNamePattern>
26         </rollingPolicy>
27         <layout class="ch.qos.logback.classic.PatternLayout">
28             <Pattern>
29                 %d{yyyy-MM-dd HH:mm:ss} -%msg%n
30             </Pattern>
31         </layout>
32     </appender>
33
34     <logger name="com.tswc.edu" additivity="false">
35         <appender-ref ref="console"/>
36         <appender-ref ref="logFile" />
37     </logger>
38
39     <root level="error">
40         <appender-ref ref="console"/>
41         <appender-ref ref="logFile" />
42     </root>
43
44 </configuration>

这里用户也可以配置多个级别使用于多个环境,对每个日志级别进行配置不同的属性,然后在 Application.xml 中选择不同的级别环境。在实际项目开发的过程中,一般配置2个环境,开发环境,生产环境。在开发环境中,只需要配置日志输出到控制台,便于开发人员调试。生成环境相反,需要配置日志输出到文件,控制台尽量不要输出日志,这样可以减少控制台对虚拟机内存的消耗,一旦产生 Bug ,用户查询日志文件即可

上述代码中即配置了日志输出到控制台,也配置了日志输出到日志文件

3.配置日志级别

只需要在 Application.xml 中配置即可:

日志级别分为5个等级,debug<info<warn<Error<Fatal,其中常用的级别为:debug和info

  • debug 级别最低,可以随意的使用于任何觉得有利于在调试时更详细的了解系统运行状态的东东;
  • info 重要,输出信息:用来反馈系统的当前状态给最终用户的; 后三个,警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态。
  • warn, 可修复,系统可继续运行下去;
  • Error, 可修复性,但无法确定系统会正常的工作下去;
  • Fatal, 相当严重,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话后果严重。

4.编写日志类

 1 @Aspect
 2 @Component
 3 public class WebLogAspect {
 4
 5     private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
 6
 7     @Pointcut("execution( * com.tswc.edu.controller.*.*(..))")//两个..代表所有子目录,最后括号里的两个..代表所有参数
 8     public void logPointCut() {
 9     }
10
11
12     @Before("logPointCut()")
13     public void doBefore(JoinPoint joinPoint) throws Throwable {
14         // 接收到请求,记录请求内容
15         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
16         HttpServletRequest request = attributes.getRequest();
17
18         // 记录下请求内容
19         logger.info("请求地址 : " + request.getRequestURL().toString());
20         //logger.info("方法描述 : " + );
21         logger.info("HTTP METHOD : " + request.getMethod());
22         // 获取真实的ip地址
23         //logger.info("IP : " + IPAddressUtil.getClientIpAddress(request));
24         logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
25                 + joinPoint.getSignature().getName());
26         logger.info("参数 : " + Arrays.toString(joinPoint.getArgs()));
27 //        loggger.info("参数 : " + joinPoint.getArgs());
28
29     }
30
31     @AfterReturning(returning = "ret", pointcut = "logPointCut()")// returning的值和doAfterReturning的参数名一致
32     public void doAfterReturning(Object ret) throws Throwable {
33         // 处理完请求,返回内容(返回值太复杂时,打印的是物理存储空间的地址)
34         logger.debug("返回值 : " + ret);
35     }
36
37     @Around("logPointCut()")
38     public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
39         long startTime = System.currentTimeMillis();
40         Object ob = pjp.proceed();// ob 为方法的返回值
41         logger.info("耗时 : " + (System.currentTimeMillis() - startTime));
42         return ob;
43     }
44 }

这是个通用类,主要约定控制台或者日志文件中日志的格式,关于此公共类,网上有大量的讲解,这里就不详细说明了。

再次启动项目,控制台将输出日志,并将日志写入到文件中:


5.新增加部分

其中自定义日志文件可以不要,这里用户自己定义了日志输出的说明部分
自定义了 @Log 注记的识别,并配置一些文件说明,那么在请求到这个类的时候,日志中将输出文章描述部分

自定义配置文件的代码:

  • Log
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 //自定义注解类   ArchivesLog.java(获取Controller描述用的)
4 public @interface Log {
5     String value() default "";
6 }
  • LogAspect
 1 public class LogAspect {
 2     private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
 3     //切点
 4     @Pointcut("@annotation(com.tswc.edu.annotation.Log)")
 5     public void logPointCut() {
 6     }
 7
 8     @Around("logPointCut()")
 9     public Object around(ProceedingJoinPoint point) throws Throwable {
10         long beginTime = System.currentTimeMillis();
11         // 执行方法
12         Object result = point.proceed();
13         // 执行时长(毫秒)
14         long time = System.currentTimeMillis() - beginTime;
15         //异步保存日志
16         //saveLog(point, time);
17         return result;
18     }
19
20 }

其中LogAspect中也可以写一些对日志进行 CRUD 的业务逻辑操作,大多数情况下,此处可以将日志的保存逻辑写入到此类中。

6.问题

本项目在启动的时候,报了一个关于日志的警告,没有找到解决方案

项目中并没有用到log4j,不知道为什么会警告,项目中缺少log4j的配置文件,如果有大神知道原因,欢迎留言

原文地址:https://www.cnblogs.com/dz-boss/p/10466812.html

时间: 2024-08-28 06:33:40

Spring Boot 入门(五):集成 AOP 进行日志管理的相关文章

Spring boot 入门五:springboot 开启声明式事务

springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事务.这里以spring整合mybatis为例讲解声明式事务 数据源配置 这里的配置都基于前几讲的配置,之前spring整合mybatis 是基于注解实现CRUD操作,这次基于xml的配置文件.spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.dataso

Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图

本篇文章是接着Spring Boot 入门(五):集成 AOP 进行日志管理写的,主要集成了树形图,在部门列表或者权限列表中,树形图经常被用上.主要是根据相应的 API 凭借 html 字符串 1.treetable 1 <link href="/plugins/treeTable/themes/default/treeTable.css" rel="stylesheet" type="text/css" /> 2 <scrip

Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理

本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 PageHelper 进行分页显示.按照前面的博客,已经可以搭建一个简单的 Spring Boot 系统,本篇博客继续对此系统进行改造,主要集成了 Shiro 权限认证框架,关于 Shiro 部分,在本人之前的博客(认证与Shiro安全框架)有介绍到,这里就不做累赘的介绍. 此系列的博客为实践部分

Spring Boot 入门(八):集成RabbitMQ消息队列

本片文章续<Spring Boot 入门(七):集成 swagger2>,关于RabbitMQ的介绍请参考<java基础(六):RabbitMQ 入门> 1.增加依赖 1 <!--rabbitMq--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-amqp</artifac

Spring Boot 入门(十一):集成 WebSocket, 实时显示系统日志

以前面的博客为基础,最近一篇为Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存.本篇博客主要介绍了Spring Boot集成 Web Socket进行日志的推送,并实时显示在页面上. 1.导入jar包 第一个jar包是websocket的,第二个jar包是关于环形队列的jar包,本案例是通过本地队列存储日志.有条件的话,最好通过中间件存储(eg:redis,mq……).通过本地队列存储日志会存在日志丢失的情况,且日志量太大,会把页面卡死. 1 <!--beg

Spring Boot 入门之消息中间件篇(五)

原文地址:Spring Boot 入门之消息中间件篇(五) 博客地址:http://www.extlight.com 一.前言 在消息中间件中有 2 个重要的概念:消息代理和目的地.当消息发送者发送消息后,消息就被消息代理接管,消息代理保证消息传递到指定目的地. 我们常用的消息代理有 JMS 和 AMQP 规范.对应地,它们常见的实现分别是 ActiveMQ 和 RabbitMQ. 上篇文章<Spring Boot 入门之缓存和 NoSQL 篇(四)>. 二.整合 ActiveMQ 2.1 添

Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybatis和pagehelper 关于mybatis和pagehelper的介绍,可以自行博客,网上很多类似的博客,这里,我直接上代码和项目搭建教程. 1.配置文件:在配置文件application.yml中配置MySql数据库连接池和Mybatis扫描包以及PageHelper分页插件 1 mybati

Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了SpringBoot如何集成Mybatis和Pagehelper,但是没有做出实际的范例,本篇博客是连接上一篇写的.通过AdminLTE前端框架,利用DataTable和PageHelper进行分页显示,通过对用户列表的增删改查操作,演示DataTable和PageHelper的使用. (1)Admi

Spring Boot 入门(七):集成 swagger2

本片文章是基于前一篇写的,<Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图>,本篇主要介绍了spring boot集成swagger2.关于swagger的介绍,自行谷歌.我这里有在网上购买的相关视频资料,有需要可以呼叫我. 1.引入相关依赖 1 <dependency> 2 <groupId>io.springfox</groupId> 3 <artifactId>springfox-swagger2&