1、通过导入包的形式
package com.example.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/log") @RestController public class rizhi { private static final Logger logger = LoggerFactory.getLogger(rizhi.class); @RequestMapping("/logg") public String logger(){ logger.info("我是日志"); return "success"; } }
2、slf4j是一个日志门面,并不是一个实现日志的框架,log4j是实现日志的框架(SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现, ⽽是⼀个抽象层, 对⽇志框架制定的⼀种规范, 标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使用)
3、SLF4J是⻔⾯模式的典型应⽤,⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤
4、门面模式实现
(1)⽐如去医院看病,可能要去挂号, ⻔诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待⼈员, 只让接待⼈员来处理, 就很⽅便
(2)回家, 我们会开各个屋的灯. 离开家时, 会关闭各个屋的灯如果家⾥设置⼀个总开关, 来控制整个屋的灯就会很⽅便.
5、门面模式的优点
(1)减少了系统的相互依赖. 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它 的客⼾端; (2)提⾼了灵活性, 简化了客⼾端对⼦系统的使⽤难度, 客⼾端⽆需关⼼⼦系统的具体实现⽅式, ⽽只需要和⻔⾯对象交互即可. (3)提⾼了安全性. 可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问6、不引入日志门面产生的问题
(1)不同⽇志框架的API接⼝和配置⽂件不同, 如果多个⽇志框架共存, 那么不得不维护多套配置⽂件(这 个配置⽂件是指⽤⼾⾃定义的配置⽂件). (2)如果要更换⽇志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突. (3)如果引⼊的第三⽅框架, 使⽤了多套, 那就不得不维护多套配置7、 日志级别的分类(由开发人员自己设定)
(1)⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE (2)FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误. (3)ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏. (4)WARN: 警告信息, 不影响使⽤, 但需要注意的问题 (5)INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等. (6)DEBUG: 调试信息, 需要调试时候的关键信息打印. (7)TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代) 8、日志级别的使用@RequestMapping("/printLog") public String printLog() { logger.trace("================= trace ==============="); logger.debug("================= debug ==============="); logger.info("================= info ==============="); logger.warn("================= warn ==============="); logger.error("================= error ==============="); return "打印不同级别的⽇志" ; }
我们发现只有三个显示出来了,因为出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤,⽇志的输出级别默认是 info级别, 所以只会打印⼤于等于此级别的⽇志, 也就是info, warn和error
9、设置显示什么日志(通过配置文件来完成),此时就可以将debug文件显示出来
(1)Properties配置
logging.level.root: debug
(2)yml配置
logging: level: root: debug
10、日志持久化显示(以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把⽇志保存下来就叫持久化)
logging: file: path: D:/temp name:logger/ioc.log
解释:如果我们path和name同时存在时候,我们的path会不生效,我们的name可以为他命名,此时命名为ioc.log,我们名字头面加了一个logger的意思时我们会把ioc.log文件存放在logger下面,如果没头面的logger我们就会默认把ioc.log放在我们的src文件下面
11、我们的yml配置都可以去spring文档里面找
12、文件分割(如果一个文件太大,就不方便我们观看)
logging: logback: rollingpolicy: file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i max-file-size: 2KB
(1)日志分割格式
${LOG_FILE}.%d{yyyy-MM-dd}.%i
(2)文件达到2KB就进行分割,划分出一个新的文件
max-file-size: 2KB
13、配置项说明
(1)%clr(表达式){颜⾊} 设置输⼊⽇志的颜⾊
(2)%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ⽇期和时间--精确到毫秒
(3)%5p 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE
(4)%t 线程名. %c 类的全限定名. %M method. %L 为⾏号. %thread 线程名称. %m 或者%msg 显⽰输出消息. %n 换⾏符
(5)%5 若字符⻓度⼩于5,则右边⽤空格填充. %-5 若字符⻓度⼩于5,则左边⽤空格填充. %.15 若字符⻓度超过15,截去多余字符. %15.15 若字符⻓度⼩于15,则右边⽤空格填充. 若字符⻓度超过15,截去多余字符
14、需要配置, 让idea⽀持控制台颜⾊显⽰
在这里添加配置项,让日志显示颜色配置项 -Dspring.output.ansi.enabled=ALWAYS
15、配置日志格式
(1)Properties配置
logging.pattern.console='%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
(2)yml配置
logging: pattern: console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n' file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
console:控制台日志
file:文件日志
16、更简单的日志打印方法(用@slf4j)lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象 log, 我们直接使⽤就可以
(1)引入依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
(2)输出日志
import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController public class LogController { public void log(){ log.info("--------------要输出⽇志的内容----------------"); } }
17、模板模式:定义了一些方法,一个流程,并不实现,创建一些子类来实现