标签:ignore 重要 arc sign erro roo 情况下 www 日志文件
本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页查询,Generator 代码自动生成器,Shiro登录及权限管理。本篇博客主要是集成 AOP 进行日志管理
1 <!-- aop --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-aop</artifactId> 5 </dependency>
关于 Logback-spring 的配置网上很多,随便copy一份基本上就能使用,Logback-spring.xml 中主要配置了下列内容
我也是直接在copy了一份,代码如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration scan="true" scanPeriod="60 seconds" debug="false"> 3 <contextName>logback</contextName> 4 <!-- 5 <!– 文件输出格式 –> 6 <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" /> 7 <!– test文件路径 –> 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 ,用户查询日志文件即可
上述代码中即配置了日志输出到控制台,也配置了日志输出到日志文件
只需要在 Application.xml 中配置即可:
日志级别分为5个等级,debug<info<warn<Error<Fatal,其中常用的级别为:debug和info1 @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 }
这是个通用类,主要约定控制台或者日志文件中日志的格式,关于此公共类,网上有大量的讲解,这里就不详细说明了。
再次启动项目,控制台将输出日志,并将日志写入到文件中:
自定义配置文件的代码:
1 @Target(ElementType.METHOD) 2 @Retention(RetentionPolicy.RUNTIME) 3 //自定义注解类 ArchivesLog.java(获取Controller描述用的) 4 public @interface Log { 5 String value() default ""; 6 }
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 的业务逻辑操作,大多数情况下,此处可以将日志的保存逻辑写入到此类中。
本项目在启动的时候,报了一个关于日志的警告,没有找到解决方案
项目中并没有用到log4j,不知道为什么会警告,项目中缺少log4j的配置文件,如果有大神知道原因,欢迎留言
Spring Boot 入门(五):集成 AOP 进行日志管理
标签:ignore 重要 arc sign erro roo 情况下 www 日志文件
原文地址:https://www.cnblogs.com/dz-boss/p/10466812.html