目录
1.记录应⽤系统⽈志主要有三个原因 记录操作轨迹、监控系统运⾏状况、回溯系统故障。
记录操作⾏为及操作轨迹数据,可以数据化地分析⽤户偏好,有助于优化业务逻辑,为⽤户提供个性化的服务。例如,通过 access.log 记录⽤户的操作频度和跳转链接,有助于分析⽤户的后续⾏为。
2.全⾯有效的⽇志系统有助于建⽴完善的应⽤监控体系,由此⼯程师可以实时监控系统运⾏状况,及时预警,避免故障发⽣。
监控系统运⾏状况,是指对服务器使⽤状态,如内存、 CPU 等使⽤情况,应⽤运⾏情况如响应时间 QPS 等交互状态;应⽤错误信息,如空指针、 SQL 异常等的监控。例如,在CPU 使⽤率⼤于 60%, 四核服务器中load ⼤于4时发出报警,提醒⼯程师及时处理,避免发⽣故障。
3.当系统发⽣线上问题时,完整的现场⽇志有助于⼯程师快速定位问题。
例如当系统内存溢出时,如果⽇志系统记录了问题发⽣现场的堆信息,就可以通过这个⽈志分析是什么对象在⼤量产⽣并且没有释放内存,回溯系统故障,从⽽定位问题。
⻔⾯设计模式是⾯向对象设计模式中的⼀种,⽇志框架采⽤的就是这种模式,类似JDBC 的设计理念。它只提供⼀套接⼝规范,⾃身不负责⽇志功能的实现。⽬的是让使⽤者不需要关注底层具体是哪个⽇志库来负责⽇志打印及具体的使⽤细节等。⽬前⽤得最为⼴泛的是 slf4j
负责实现⽇志相关功能,主流⽇志库有三个分别为:
log4j、log-jdk(java.util.logging.Logger)、logback。logback是最晚出现的,与log4j同⼀个作者,是log4j的升级版且本身实现了slf4j的接⼝。
⽼⼯程直接使⽤⽇志库API完成⽇志打印,要改成业界标准的⻔⾯模式(如slf4j+logback),但是⽼⼯程代码打印⽇志地⽅太多难以改动,这是就需要⼀个适配器来完成从旧⽇志库的API到slf4j的路由,这样在不改动原有代码的情况下也能使⽤slf4j来统⼀管理⽇志(如:log4j-over-slf4j),后续⾃由替换具体⽇志库也不成问题。
在开发的时候不应该直接使⽤⽇志实现类,应该使⽤⽇志的抽象层。具体参考SLF4J Manual。
下图是 SLF4J 结合各种⽇志框架的官⽅示例,从图中可以清晰的看出 SLF4J API 永远作为⽇志的⻔⾯,直接应⽤与应⽤程序中。
springboot的底层spring-boot-starter-logging可以看出,它依赖的3个⽇志框架:slf4j、Logback、Log4j2 。它们的区别是:
- logback和log4j是⽇志实现框架,就是实现怎么记录⽇志的。
- slf4j-api提供了java所有⽇志框架的简单规范和标准(⽇志的⻔⾯设计模式)说⽩了就是⼀个⽇志API(没有实现类),它不能单独使⽤:故必须结合logback和Log4j2 ⽇志框
注意:Spring Boot 采⽤了 slf4j+logback 的组合形式,Spring Boot也提供对JUL、log4j2、Logback提供了默认配置
注意:由于每⼀个⽇志的实现框架都有⾃⼰的配置⽂件,所以在使⽤ SLF4j 之后,配置⽂件还是要使⽤实现⽇志框架的配置⽂件。
Spring Boot 默认已经使⽤了 SLF4J + LogBack . 所以我们在不进⾏任何额外操作的情况下就可以使⽤ SLF4J + Logback 进⾏⽇志输出。
⽇志的级别分为6种:
Java 测试类进⾏测试。
- @SpringBootTest
- class Demo6SpringbootLogApplicationTests {
-
- @Test
- void contextLoads() {
- Logger logger = LoggerFactory.getLogger(getClass());
- logger.trace("Trace ⽇志...");
- logger.debug("Debug ⽇志...");
- logger.info("Info ⽇志...");
- logger.warn("Warn ⽇志...");
- logger.error("Error ⽇志...");
- }
-
- }
已知⽇志级别从⼩到⼤为 trace < debug < info < warn < error . 运⾏得到输出如下。
Spring Boot 默认⽇志级别为 INFO,只打印更严重的 .
⼀般情况下,开发时候使⽤DEBUG,上线后使⽤INFO,运维信息记录使⽤WARN即可。
- @SpringBootTest
- class Demo6SpringbootLogApplicationTests {
-
- @Test
- void contextLoads() {
- Logger logger = LoggerFactory.getLogger(getClass());
- logger.trace("Trace ⽇志...");
- logger.debug("Debug ⽇志...");
- logger.info("Info ⽇志...");
- logger.warn("Warn ⽇志...");
- logger.error("Error ⽇志...");
- }
-
- }
导入依赖lombok
org.projectlombok lombok
- /**
- * 测试⽇志输出,
- * SLF4J ⽇志级别从⼩到⼤trace,debug,info,warn,error
- *
- */
- @Slf4j//注解方式获取日志对象
- @SpringBootTest
- class Demo6SpringbootLogApplicationTests {
-
- @Test
- void contextLoads() {
-
- //使用内置的log对象
- log.trace("Trace ⽇志...");
- log.debug("Debug ⽇志...");
- log.info("Info ⽇志...");
- log.warn("Warn ⽇志...");
- log.error("Error ⽇志...");
- }
-
- }
# 开启debug模式,输出调试信息,常⽤于检查系统运⾏状况
debug: true
# 设置⽇志级别,root表示根节点,即整体应⽤⽇志级别
logging:
level:
root: debug
# 设置⽇志级别 logging: # 设置⽇志组 group: # ⾃定义组名,设置当前组中所包含的包 mygroup: com.qfedu.app.controller level: # root表示根节点,即整体应⽤⽇志级别 root: warn # 为对应组设置⽇志级别 mygroup: debug
例如:
# 修改⽇志级别 logging: # 设置⽇志格式 pattern: # 控制输出的格式 #格式化输出:%d:表示⽇期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:⽇志消息 %n:是换⾏符 console: "[console]==%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger - %msg%n" # ⽂件输出的格式 file: "[file]===%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger - %msg%n"
使⽤%clr转换字配置颜⾊编码。在最简单的形式中,转换器根据⽇志级别为输出着⾊,如以下示例所示:
%clr(%5p)
下表描述了⽇志级别到颜⾊的映射:
或者,您可以通过将其作为转换选项提供来指定应使⽤的颜⾊或样式。例如,要使⽂本变⻩,请使⽤以下设置:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
⽀持以下颜⾊和样式: blue cyan faint green magenta red yellow
要把⽇志记录到⽂件中,⽅便后期维护查阅。
logging: file: name: src/main/resources/tomcatserver.log
通常会每天记录⽇志⽂件,同时为了便于维护,还要限制每个⽇志⽂件的⼤⼩。下⾯给出⽇志⽂件的常⽤配置⽅式:
logging: logback: rollingpolicy: max-file-size: 2KB file-name-pattern: /src/main/resources/server.%d{yyyy-MM-dd}.%i.log
以上格式是基于logback⽇志技术设置每⽇⽇志⽂件的设置格式,要求容量到达2KB以后就转存信息到第⼆个⽂件中。⽂件命名规则中的%d标识⽇期,%i是⼀个递增变量,⽤于区分⽇志⽂件。