一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Logback配置文件這么寫(TPS提高10倍)

Logback配置文件這么寫(TPS提高10倍)

2020-08-11 18:09何甜甜在嗎 Java教程

這篇文章主要介紹了Logback配置文件這么寫(TPS提高10倍),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

通過閱讀本篇文章將了解到

  • 1.日志輸出到文件并根據(jù)level級別將日志分類保存到不同文件
  • 2.通過異步輸出日志減少磁盤io提高性能
  • 3.異步輸出日志的原理

配置文件logback-spring.xml"> 配置文件logback-spring.xml

springboot工程自帶logbackslf4j的依賴,所以重點放在編寫配置文件上,需要引入什么依賴,日志依賴沖突統(tǒng)統(tǒng)都不需要我們管了。logback框架會默認加載classpath下命名為logback-springlogback的配置文件。將所有日志都存儲在一個文件中文件大小也隨著應用的運行越來越大并且不好排查問題,正確的做法應該是將error日志和其他日志分開,并且不同級別的日志根據(jù)時間段進行記錄存儲。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <property resource="logback.properties"/>
    <appender name="console-log" class="ch.qos.logback.core.consoleappender">
        <layout class="ch.qos.logback.classic.patternlayout">
            <pattern>[%d{yyyy-mm-dd' 'hh:mm:ss.sss}] [%c] [%t] [%l] [%-5p] %m%n</pattern>
        </layout>
    </appender>
    <!--獲取比info級別高(包括info級別)但除error級別的日志-->
    <appender name="info-log" class="ch.qos.logback.core.rolling.rollingfileappender">
        <filter class="ch.qos.logback.classic.filter.levelfilter">
            <level>error</level>
            <onmatch>deny</onmatch>
            <onmismatch>accept</onmismatch>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-mm-dd' 'hh:mm:ss.sss}] [%c] [%t] [%l] [%-5p] %m%n</pattern>
        </encoder>
 
        <!--滾動策略-->
        <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
            <!--路徑-->
            <filenamepattern>${log_info_home}//%d.log</filenamepattern>
            <maxhistory>30</maxhistory>
        </rollingpolicy>
    </appender>
    <appender name="error-log" class="ch.qos.logback.core.rolling.rollingfileappender">
        <filter class="ch.qos.logback.classic.filter.thresholdfilter">
            <level>error</level>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-mm-dd' 'hh:mm:ss.sss}] [%c] [%t] [%l] [%-5p] %m%n</pattern>
        </encoder>
        <!--滾動策略-->
        <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
            <!--路徑-->
            <filenamepattern>${log_error_home}//%d.log</filenamepattern>
            <maxhistory>30</maxhistory>
        </rollingpolicy>
    </appender>
 
    <root level="info">
        <appender-ref ref="console-log" />
        <appender-ref ref="info-log" />
        <appender-ref ref="error-log" />
    </root>
</configuration>

部分標簽說明

  • ?
    1
    <root>

    標簽,必填標簽,用來指定最基礎的日志輸出級別

    • <appender-ref>標簽,添加append
  • ?
    1
    <append>

    標簽,通過使用該標簽指定日志的收集策略

    • name屬性指定appender命名
    • class屬性指定輸出策略,通常有兩種,控制臺輸出和文件輸出,文件輸出就是將日志進行一個持久化。consoleappender將日志輸出到控制臺
  • ?
    1
    <filter>

    標簽,通過使用該標簽指定過濾策略

    • <level>標簽指定過濾的類型
  • <encoder>標簽,使用該標簽下的<pattern>標簽指定日志輸出格式

  • ?
    1
    <rollingpolicy>

    標簽指定收集策略,比如基于時間進行收集

    • <filenamepattern>標簽指定生成日志保存地址 通過這樣配置已經(jīng)實現(xiàn)了分類分天手機日志的目標了

Logback配置文件這么寫(TPS提高10倍)

logback 高級特性異步輸出日志

之前的日志配置方式是基于同步的,每次日志輸出到文件都會進行一次磁盤io。采用異步寫日志的方式而不讓此次寫日志發(fā)生磁盤io,阻塞線程從而造成不必要的性能損耗。異步輸出日志的方式很簡單,添加一個基于異步寫日志的appender,并指向原先配置的appender即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 異步輸出 -->
   <appender name="async-info" class="ch.qos.logback.classic.asyncappender">
       <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄tract、debug、info級別的日志 -->
       <discardingthreshold>0</discardingthreshold>
       <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
       <queuesize>256</queuesize>
       <!-- 添加附加的appender,最多只能添加一個 -->
       <appender-ref ref="info-log"/>
   </appender>
 
   <appender name="async-error" class="ch.qos.logback.classic.asyncappender">
       <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄tract、debug、info級別的日志 -->
       <discardingthreshold>0</discardingthreshold>
       <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
       <queuesize>256</queuesize>
       <!-- 添加附加的appender,最多只能添加一個 -->
       <appender-ref ref="error-log"/>
   </appender>

異步輸出日志性能測試

既然能提高性能的話,必須進行一次測試比對,同步和異步輸出日志性能到底能提升多少倍?

服務器硬件

  • cpu六核
  • 內(nèi)存 8g

測試工具

?
1
apache jmeter

同步輸出日志

  • 線程數(shù):100

  • ramp-up loop(可以理解為啟動線程所用時間) :0 可以理解為100個線程同時啟用

  • 測試結(jié)果

    Logback配置文件這么寫(TPS提高10倍)

    重點關注指標

    ?
    1
    throughput【tps】

    吞吐量:系統(tǒng)在單位時間內(nèi)處理請求的數(shù)量,在同步輸出日志中

    ?
    1
    tps

    44.2/sec

異步輸出日志

  • 線程數(shù) 100

  • ramp-up loop:0

  • 測試結(jié)果

    Logback配置文件這么寫(TPS提高10倍)

    ?
    1
    tps

    497.5/sec

    性能提升了10多倍!!!

異步日志輸出原理

logback框架下的logger.info方法開始追蹤。一路的方法調(diào)用路徑如下圖所示:

Logback配置文件這么寫(TPS提高10倍)

異步輸出日志中最關鍵的就是配置文件中ch.qos.logback.classic``asyncappenderbase``append

?
1
2
3
4
5
6
protected void append(e eventobject) {
        if(!this.isqueuebelowdiscardingthreshold() || !this.isdiscardable(eventobject)) {
            this.preprocess(eventobject);
            this.put(eventobject);
        }
    }

通過隊列情況判斷是否需要丟棄日志,不丟棄的話將它放到阻塞隊列中,通過查看代碼,這個阻塞隊列為arrayblockingqueueu,默認大小為256,可以通過配置文件進行修改。logger.info(...)append(...)就結(jié)束了,只做了將日志塞入到阻塞隊列的事,然后繼續(xù)執(zhí)行logger.info(...)下面的語句了。 在asyncappenderbase類中定義了一個worker線程,run方法中的關鍵部分代碼如下:

?
1
2
e e = parent.blockingqueue.take();
aai.appendlooponappenders(e);

從阻塞隊列中取出一個日志,并調(diào)用appenderattachableimpl類中的appendlooponappenders方法維護一個append列表。worker線程中調(diào)用方法過程主要如下圖:

Logback配置文件這么寫(TPS提高10倍)

最主要的兩個方法就是encode``write``encode

作者:何甜甜在嗎鏈接:

最后附:項目完整代碼

異步輸出日志

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <property resource="logback.properties"/>
    <appender name="console-log" class="ch.qos.logback.core.consoleappender">
        <layout class="ch.qos.logback.classic.patternlayout">
            <pattern>[%d{yyyy-mm-dd' 'hh:mm:ss.sss}] [%c] [%t] [%l] [%-5p] %m%n</pattern>
        </layout>
    </appender>
    <!--獲取比info級別高(包括info級別)但除error級別的日志-->
    <appender name="info-log" class="ch.qos.logback.core.rolling.rollingfileappender">
        <filter class="ch.qos.logback.classic.filter.levelfilter">
            <level>error</level>
            <onmatch>deny</onmatch>
            <onmismatch>accept</onmismatch>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-mm-dd' 'hh:mm:ss.sss}] [%c] [%t] [%l] [%-5p] %m%n</pattern>
        </encoder>
 
        <!--滾動策略-->
        <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
            <!--路徑-->
            <filenamepattern>${log_info_home}//%d.log</filenamepattern>
            <maxhistory>30</maxhistory>
        </rollingpolicy>
    </appender>
    <appender name="error-log" class="ch.qos.logback.core.rolling.rollingfileappender">
        <filter class="ch.qos.logback.classic.filter.thresholdfilter">
            <level>error</level>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-mm-dd' 'hh:mm:ss.sss}] [%c] [%t] [%l] [%-5p] %m%n</pattern>
        </encoder>
        <!--滾動策略-->
        <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
            <!--路徑-->
            <filenamepattern>${log_error_home}//%d.log</filenamepattern>
            <maxhistory>30</maxhistory>
        </rollingpolicy>
    </appender>
    <!-- 異步輸出 -->
    <appender name="async-info" class="ch.qos.logback.classic.asyncappender">
        <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄tract、debug、info級別的日志 -->
        <discardingthreshold>0</discardingthreshold>
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
        <queuesize>256</queuesize>
        <!-- 添加附加的appender,最多只能添加一個 -->
        <appender-ref ref="info-log"/>
    </appender>
 
    <appender name="async-error" class="ch.qos.logback.classic.asyncappender">
        <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄tract、debug、info級別的日志 -->
        <discardingthreshold>0</discardingthreshold>
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
        <queuesize>256</queuesize>
        <!-- 添加附加的appender,最多只能添加一個 -->
        <appender-ref ref="error-log"/>
    </appender>
 
    <root level="info">
        <appender-ref ref="console-log" />
        <appender-ref ref="info-log" />
        <appender-ref ref="error-log" />
    </root>
</configuration>
?
1
2
log_error_home=c://users//hetiantian//desktop//log//error
log_info_home=c://users//hetiantian//desktop//log//info

最主要的兩個方法就是encode和write方法,前一個法方會根據(jù)配置文件中encode指定的方式轉(zhuǎn)化為字節(jié)碼,后一個方法將轉(zhuǎn)化成的字節(jié)碼寫入到文件中去。所以寫文件是通過新起一個線程去完成的,主線程將日志扔到阻塞隊列中,然后又去做其他事情了。
最后附:項目完整代碼

到此這篇關于Logback配置文件這么寫(TPS提高10倍)的文章就介紹到這了,更多相關Logback配置文件內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.im/post/6844903909920604174

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 五月天国产精品 | 色综合天天综合中文网 | 亚洲 欧美 日韩 国产 视频 | 欧美乱妇高清无乱码视频在线 | 韩国女主播在线大尺无遮挡 | 日本人在线看片 | 93版高校教师 | 亚洲欧美日韩一区成人 | 热99re久久精品国产首页 | 久久国产乱子伦免费精品 | 欧美综合亚洲图片综合区 | 99久久99热久久精品免费看 | 国产91亚洲精品 | 午夜尤物 | 娇妻在床上迎合男人 | 亚洲精品αv一区二区三区 亚洲精品91大神在线观看 | 国产高清免费午夜在线视频 | 娇妻与公陈峰姚瑶最新版 | 日本在线观看www鲁啊鲁视频 | 男人和女人全黄一级毛片 | 日本高清在线播放一区二区三区 | 大又大又黄又爽免费毛片 | 精品小视频在线观看 | 2019理论韩国理论中文 | 国产高清自拍视频 | 99在线观看国产 | 欧美贵妇videos办公室360 | 欧美国产精品久久 | 2019国内自拍| 饭冈加奈子在线播放观看 | 舔大逼| 精品国产爱久久 | 欧美高清一区 | 国产成人h视频在线播放网站 | 护士让我吃奶我扒她奶 | 国产福利视频一区二区微拍 | 免费日韩 | 久久中文字幕亚洲精品最新 | 草久久网 | 欧美在线一级视频 | 亚洲成人综合在线 |