You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
2.1 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## 日志配置及日志相关的实践
### 1. Logback 配置文件, 高TPS的配置
#### 1.1 功能描述
- 日志输出到文件并根据LEVEL级别将日志分类保存到不同文件
- 通过异步输出日志减少磁盘IO提高性能
- 理解(异步输出日志的原理)
#### 1.2 配置文件logback-spring.xml
- SpringBoot工程自带logback和slf4j的依赖
- logback框架会默认加载classpath下命名为logback-spring或logback的配置文件
- 将所有日志都存储在一个文件中文件大小也随着应用的运行越来越大并且不好排查问题
- 正确的做法应该是将error日志和其他日志分开, 并且不同级别的日志根据时间段进行记录存储
#### 1.3 异步日志输出原理
- 从logback框架下的Logger.info方法开始追踪。一路的方法调用路径如下图所示
- ![异步日志原理图](pic/Logback异步日志原理图.png)
- 异步输出日志中最关键的就是配置文件中ch.qos.logback.classic``AsyncAppenderBase``append
```java
protected void append(E eventObject) {
if(!this.isQueueBelowDiscardingThreshold() || !this.isDiscardable(eventObject)) {
this.preprocess(eventObject);
this.put(eventObject);
}
}
```
- 通过队列情况判断是否需要丢弃日志,不丢弃的话将它放到阻塞队列中,
- 通过查看代码这个阻塞队列为ArrayBlockingQueueu默认大小为256可以通过配置文件进行修改。
- Logger.info(...)到append(...)就结束了,只做了将日志塞入到阻塞队列的事, 然后继续执行Logger.info(...)下面的语句了。
- 在AsyncAppenderBase类中定义了一个Worker线程run方法中的关键部分代码如下:
```java
E e = parent.blockingQueue.take();
aai.appendLoopOnAppenders(e);
```
- 从阻塞队列中取出一个日志并调用AppenderAttachableImpl类中的appendLoopOnAppenders方法维护一个Append列表。
- Worker线程中调用方法过程主要如下图
- ![LogbackWorker线程的执行逻辑](pic/Logback异步日志原理图.png)
- 最主要的两个方法就是encode``write``encode