做网站所具备的的条件,4399网站开发,php主机网站,上海待遇好的十大外企招聘日志概述 ⽇志对我们来说并不陌⽣#xff0c;我们经常需要通过打印⽇志来发现和定位问题,或者根据⽇志来分析程序的运⾏过程.在Spring的学习中, 也经常需要根据控制台的⽇志来分析和定位问题.
打印日志
一#xff1a;在程序中得到⽇志对象. 通过⽇志⼯⼚ LoggerFactory 获取…日志概述 ⽇志对我们来说并不陌⽣我们经常需要通过打印⽇志来发现和定位问题,或者根据⽇志来分析程序的运⾏过程.在Spring的学习中, 也经常需要根据控制台的⽇志来分析和定位问题.
打印日志
一在程序中得到⽇志对象. 通过⽇志⼯⼚ LoggerFactory 获取 在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory如下代码所⽰
private static Logger loggerLoggerFactory.getLogger(LoggerController.class); LoggerFactory.getLogger 方法需要传递⼀个参数,参数可以是 String 类型或者 类对象 标识这个⽇志的名称.这样可以更清晰的知道是哪个类输出的⽇志.当有问题时,可以更⽅便直观的定位到问题类所以通常情况下传入的参数都是当前类的类对象 注意Logger 对象是属于 org.slf4j 包下的, 不要导⼊错包. 通过 lombok 提供的 Slf4j 注解 lombok 是一个程序猿很常用的工具类它提供了 Slf4j 注解帮助我们快速的创建⽇志对象代码如下 首先添加 lombok 依赖
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency 通过 Slf4j 注解快速获取⽇志对象
Slf4j
public class LoggerController {public static void printLog() {log.error(打印error日志);}
} 如上代码在类 LoggerController 前加 Slf4j 注解就相当于写了一段如下的代码到类 LoggerController 中创建了名称为 log 的日志对象直接使用即可
private final static Logger logLoggerFactory.getLogger(LoggerController.class); 二使⽤⽇志对象输出要打印的内容. 日志打印的方法对应日志的级别⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE 后面会详细介绍打印日志的代码如下
public static void printLog() {log.error(打印error日志);log.warn(打印warn日志);log.info(打印info日志);log.debug(打印debug日志);log.trace(打印trace日志);} SLF4J 框架介绍 SLF4J 就是其他日志框架的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 但并不涉及到具体的⽇志逻辑实现. SLF4J是⻔⾯/外观模式的典型应⽤
门面/外观模式定义 ⻔⾯模式Facade Pattern⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝,让⼦系统更容易使⽤.其中 SLF4J 就是日志框架中的高层接口
SLF4J 框架的意义 SLF4J 框架既然不是具体实现功能的日志框架那么它存在有什么意义呢假设现在我们不引入 SLF4J 这个门面框架 常⻅的实现功能的⽇志框架有 log4J , logback 等.如果⼀个项⽬已经使⽤了 log4j ⽽你依赖的另⼀个类库假如是 Apache Active MQ, 它依赖于另外⼀个⽇志框架logback, 那么你就需要把logback 也加载进去.此时项目中就存在了两个日志框架这就会导致一些问题 1. 不同⽇志框架的API接和配置⽂件不同,如果多个⽇志框架共存,那么不得不维护多套配置⽂件(这个配置⽂件是指用户⾃定义的配置⽂件). 2. 如果要更换⽇志框架,应⽤程序将不得不修改代码,并且修改过程中可能会存在⼀些代码冲突. 现在我们引入 SLF4J 这个门面框架 引⼊⻔⾯⽇志框架之后,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架 实现),此时应⽤程序只需要维护⼀套⽇志⽂件配置, 简单来说SLF4J 门面框架作为实现功能的框架和应用程序的中间者它管理了很多功能框架的 api 接口为应用程序提供一个统一的 api 接口降低了应用程序使用框架的难度并且避免了应用程序和功能框架进行直接接触起到了解耦的效果当功能框架的内部实现发生变化门面框架为应用程序提供的 api 不会发生变化就不用修改应用程序的代码
⽇志格式的说明 上图所示的是一段 Spring Boot 的日志⽇志输出内容元素具体如下
1. 时间⽇期精确到毫秒
2. ⽇志级别ERROR, WARN, INFO, DEBUG 或TRACE
3. 进程ID
4. 线程名
5. Logger日志对象名通常是日志对象所在类的类名
6. ⽇志内容
⽇志级别 日志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE FATAL:致命信息表⽰需要⽴即被处理的系统级错误. ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏. WARN:警告信息,不影响使⽤,但需要注意的问题 INFO:普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等 DEBUG:调试信息,需要调试时候的关键信息打印 TRACE:追踪信息,⽐DEBUG更细粒度的信息事件(因为级别过低除⾮有特殊⽤意否则请使⽤DEBUG级别替代) 级别越⾼,收到的消息越少 要是细心我们会发现在 ⽇志格式的说明 中⽇志级别没有提到 FATAL致命信息这是因为 Spring 没有提供 FATAL 级别的日志打印因为没有必要如果发生 FATAL 级别的错误程序马上就无法运行也就会被马上发现了
⽇志配置
配置⽇志级别 该配置项设置了最低显示的日志级别Spring 默认是 info 所以我们要想看到 debug 级别的日志就需要设置最低显示的日志级别为 debug
logging.level.root debug 其中 root 表示根目录表示设置了所有类打印的日志级别我们也可以单独设置某个类最低显示的日志级别,路径可以是相对路径也可以是绝对路径一般写 java 文件下的路径
logging.level.com.example.springbootdemodebug
⽇志持久化 默认情况下日志都是输出在控制台上的,然⽽在线上环境中,我们需要把⽇志保存下来,以便出现问题之后追溯问题.把⽇志保存下来就叫持久化. ⽇志持久化有两种⽅式 1. 配置⽇志⽂件名
logging.file.namelogger/springboot.log 2. 配置⽇志的存储⽬录 只配置存储目录的话Spring 会为路径下的日志文件命名为 spring.log
logging.file.pathlogger2 注意logging.file.name 和 logging.file.path 两个都配置的情况下, 只⽣效其⼀,以 logging.file.name 为准.
配置⽇志⽂件分割 如果我们的⽇志都放在⼀个⽂件中,随着项⽬的运⾏,⽇志⽂件会越来越⼤,难以查阅所以需要对⽇志⽂件进⾏分割 配置⽇志分割后的⽂件名格式
logging.logback.rollingpolicy.file-name-pattern${LOG_FILE}.%d{yyyy-MM-dd}.%i 配置日志文件自动分割的最大内存如下代码表示当日志文件达到 10MB 就自动分割
logging.logback.rollingpolicy.max-file-size10MB 分割以后的文件如下所示 文件名包含了日志的日期和编号