從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

【同步列印的邏輯】

1、logback。xml配置

%date [%thread] %-5level %X{tid} %logger{50}:%L - %msg%n ${log。path}/server。log %d|%-5level|%X{tid}|%thread|%logger{40}|%msg%n ${log。path}/server。log。%d{yyyy-MM-dd-HH} 148

2、logback初始化時解析appender

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

裝載ConsoleAppender

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

裝載FileAppender

3、遍歷appender列印

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

一路下來會進入OutputStreamAppender。java的subAppend方法,方法裡面加鎖

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

繼續會進入LayoutWrappingEncoder。java的doEncode方法進行刷盤

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

【非同步列印的邏輯】

1、logback。xml配置

%date [%thread] %-5level %X{tid} %logger{50}:%L - %msg%n ${log。path}/server。log %d|%-5level|%X{tid}|%thread|%logger{40}|%msg%n ${log。path}/server。log。%d{yyyy-MM-dd-HH} 148 512

2、AsyncAppender初始化時會構建一個存放日誌的佇列及消費日誌的work執行緒

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

寫的時候分為兩步,第一步會把LoggingEvent放到佇列裡面就返回了

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌

第二步,worker執行緒會去消費佇列取出LoggingEvent,寫到檔案磁碟,寫磁碟的邏輯和前面同步寫的邏輯一樣

從問題出發學習slf4j、logback原始碼系列-同步和非同步日誌