日志,程序员的小本本
日志的基本配置
导入依赖
移除starter包中的原本的日志依赖,都是在父级pom.xml中配置。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!--排除springboot默认的日志依赖 后期自己整合--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
增加新的依赖
<!--日志配置--> <!--引入日志依赖 抽象层 与 实现层--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency>
日志properties配置
#创建 log4j.properties 并且放到资源文件目录 src/main/resources log4j.rootLogger=DEBUG,stdout,file log4j.additivity.org.apache=true #第一个地方stdout 输出控制台 log4j.appender.stdout=org.apache.log4j.ConsoleAppender #标准的输出信息 log4j.appender.stdout.threshold=INFO log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n #以文件形式滚动输出 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.appender.file.Threshold=INFO log4j.appender.file.append=true #日志的输出路径 log4j.appender.file.File=d:/log/wxshare/mylog.log
日志的其他介绍
log4j日志输出格式一览: %c 输出日志信息所属的类的全名 %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28 %f 输出日志信息所属的类的类名 %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 %m 输出代码中指定的信息,如log(message)中的message %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 %r 输出自应用启动到输出该日志信息所耗费的毫秒数 %t 输出产生该日志事件的线程名 #设置日志输出的等级为debug,低于debug就不会输出了 #设置日志输出到两种地方,分别叫做 stdout和 file 控制台输出和文件输出 log4j.rootLogger=DEBUG,stdout,file log4j.additivity.org.apache=true #第一个地方stdout, 输出到控制台 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.threshold=INFO #设置输出格式%5p [%t] (%F:%L) - %m%n #宽度是5的优先等级 线程名称 (文件名:行号) - 信息 回车换行 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n #以文件形式滚动输出 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.appender.file.Threshold=INFO log4j.appender.file.append=true log4j.appender.file.File=d:/log/wxshare/mylog.log
测试接口
这个是controller类
//这句话放在任何一个需要打印日志的类中 controller 或者一些service的地方
final static Logger logger = LoggerFactory.getLogger(TestController.class); @GetMapping("logtest") public void logTest() { logger.debug("debug"); logger.info("info"); logger.warn("warn"); logger.error("error"); }
测试界面
这里try it out一下,测试这个接口的目的还是为了在控制台中能看到对应的日志信息
Service日志管理-切面技术aspectJ
依赖导入
老样子,还是在父级pom.xml中进行配置
<!--配置springaop,日志监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
配置
properties里面可以加入一个sql的监控,可以输出sql查询时候的语句
#配置sql打印
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
需要切面的包结构
创建一个测试service层的接口TestService
package com.wt.service; public interface TestService { public void logTest(int seconds); public void logSqlTest(); }
创建实现类TestServiceImpl
package com.wt.service.impl; import com.wt.mapper.UserPoMapper; import com.wt.pojo.UserPo; import com.wt.service.TestService; import org.apache.ibatis.logging.stdout.StdOutImpl; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class TestServiceImpl implements TestService { @Resource private UserPoMapper userPoMapper; @Override public void logTest(int seconds) { try { Thread.sleep(1000*seconds); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void logSqlTest() { UserPo userPo = userPoMapper.selectByPrimaryKey(17); System.out.println(userPo); } }
API模块
1、在api模块中进行aop切点的操作和测试接口的开发
2、配置类aspect的开发
package com.wt.aspect; import com.wt.controller.TestController; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect //spring的aop实现底层是aspectj框架管理 @Component public class ServiceLogAspect { final static Logger log = LoggerFactory.getLogger(TestController.class); @Around("execution(* com.wt.service.impl..*.*(..))") public Object recordTimeLog(ProceedingJoinPoint joinPoint)throws Throwable { //使用日志输出 打印格式:某一个类(目标service),某一个方法(service执行方法) log.info("===开始执行{}.{}=====" // ,joinPoint.getTarget().getClass(), joinPoint.getSignature().getName() ); //记录开始时间 long begin = System.currentTimeMillis(); //执行目标 Object result = joinPoint.proceed(); //记录结束时间 long end = System.currentTimeMillis(); long takeTime = end - begin; if(takeTime>3000) { log.error("=====执行结束,耗时间{}毫秒======",takeTime); }else if(takeTime>2000) { log.warn("======执行结束,耗时{}毫秒====", takeTime); }else { log.info("====执行结束, 耗时{}毫秒======",takeTime); } return result; } }
3、测试接口controller的开发
final static Logger logger = LoggerFactory.getLogger(TestController.class); @Resource private TestService testService; //这个是测试sql打印的 @GetMapping("/logSqlTest") public void logSqlTest() { testService.logSqlTest(); } /*这里是service切面日志测试*/ @GetMapping("/logErrorTest") public void logErrorTest() { testService.logTest(3); }
测试
这个访问了,会休眠3秒以后才会响应页面,我们这个测试主要是想查看超过三秒以后,打印出来的错误信息。
这个就是控制台打印的信息,访问到service的方法,同时执行了切面的方法
这个日志还有个超级舒服的方式可以去查看,就在本地文件。
上面这个路径是我在日志文件中配置的,这个是api模块下的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步