Java日志框架性能比較

1 Java日志框架性能比較

前面幾章止毕,筆者分別介紹了log4j,logback,log4j2三大日志實現(xiàn)框架劣坊。

接下來比然,就用具體的數(shù)據(jù)比較下,哪個日志框架的性能更好桨嫁!

單線程:外循環(huán)100次,內(nèi)循環(huán)100000次份帐;

多線程:開啟100個線程瞧甩,每個線程執(zhí)行100000次;

1.1 測試代碼:

(1)log4j:

public class log4jDemo {

    Logger logger = Logger.getLogger(log4jDemo.class);

    @Test
    public void testThread() throws InterruptedException {
        int THREAD_NUM = 100;
        final int LOOP_NUM = 100000;

        final CountDownLatch countDownLatch = new CountDownLatch(THREAD_NUM);
        long start = System.currentTimeMillis();
        for(int x= 0;x < THREAD_NUM;x++){
            new Thread(new Runnable() {
                public void run() {
                    for (int y = 0; y < LOOP_NUM; y++) {
                        logger.info("Info Message!");
                    }
                    countDownLatch.countDown();
                }
            }).start();
        }
        countDownLatch.await();
        System.out.println(System.currentTimeMillis() - start);
    }

    @Test
    public void test() throws InterruptedException {
        int X_NUM = 100;
        int Y_NUM = 100000;

        long start = System.currentTimeMillis();
        for(int x=0;x < X_NUM;x++) {
            for (int y = 0; y < Y_NUM; y++) {
                logger.info("Info Message!");
            }
        }
        System.out.print(System.currentTimeMillis() - start);
    }
}

(2)logback:

public class logbackDemo {

    Logger logger =  LoggerFactory.getLogger(logbackDemo.class);

    @Test
    public void testThread() throws InterruptedException {
        int THREAD_NUM = 100;
        final int LOOP_NUM = 100000;

        final CountDownLatch countDownLatch = new CountDownLatch(THREAD_NUM);
        long start = System.currentTimeMillis();
        for(int x= 0;x < THREAD_NUM;x++){
            new Thread(new Runnable() {
                public void run() {
                    for (int y = 0; y < LOOP_NUM; y++) {
                        logger.info("Info Message!");
                    }
                    countDownLatch.countDown();
                }
            }).start();
        }
        countDownLatch.await();
        System.out.println(System.currentTimeMillis() - start);
    }

    @Test
    public void test() {
        int X_NUM = 100;
        int Y_NUM = 100000;

        long start = System.currentTimeMillis();
        for(int x=0;x<X_NUM;x++) {
            for (int y = 0; y < Y_NUM; y++) {
                logger.info("Info Message!");
            }
        }
        System.out.print(System.currentTimeMillis()-start);
    }
}

(3)log4j2:

public class log4j2Demo {
    private Logger logger = LogManager.getLogger(log4j2Demo.class);

    @Test
    public void testThread() throws InterruptedException {
        int THREAD_NUM = 100;
        final int LOOP_NUM = 100000;

        final CountDownLatch countDownLatch = new CountDownLatch(THREAD_NUM);
        long start = System.currentTimeMillis();
        for(int x= 0;x < THREAD_NUM;x++){
            new Thread(new Runnable() {
                public void run() {
                    for (int y = 0; y < LOOP_NUM; y++) {
                        logger.info("Info Message!");
                    }
                    countDownLatch.countDown();
                }
            }).start();
        }
        countDownLatch.await();
        System.out.println(System.currentTimeMillis() - start);
    }
    
    @Test
    public void test() throws InterruptedException {
        int X_NUM = 100;
        int Y_NUM = 100000;

        long start = System.currentTimeMillis();
        for(int x=0;x<X_NUM;x++) {
            for (int y = 0; y < Y_NUM; y++) {
                logger.info("Info Message!");
            }
        }
        System.out.print(System.currentTimeMillis() - start);
    }
}

1.2 配置文件:

(1)log4j:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

    <!--無緩存弥鹦,立即輸出-->
    <appender name="FILE" class="org.apache.log4j.FileAppender">
        <param name="File" value="e:/log.out" />
        <param name="append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %p %c - %m%n" />
        </layout>
    </appender>

    <!--有緩存肚逸,不立即輸出-->
    <appender name="FILE" class="org.apache.log4j.FileAppender">
        <param name="File" value="e:/log.out" />
        <param name="append" value="true"/>
        <param name="immediateFlush" value="false"/>
        <param name="bufferedIO" value="true"/>
        <param name="bufferSize" value="8192"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %p %c - %m%n" />
        </layout>
    </appender>

    <!--異步appender-->
    <appender name="AsyncAppender" class="org.apache.log4j.AsyncAppender">
        <appender-ref ref="FILE"/>
    </appender>

    <root>
        <priority value="info" />
        <appender-ref ref="FILE" />
        <appender-ref ref="AsyncAppender" />
    </root>
</log4j:configuration>

(2)logback:

<configuration >

    <!--無緩存,立即輸出-->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>e:/log.out</file>
        <append>true</append>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %p %c - %m%n</pattern>
        </encoder>
    </appender>

    <!--有緩存彬坏,不立即輸出-->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>e:/log.out</file>
        <append>true</append>
        <immediateFlush>false</immediateFlush>
        <bufferSize>8192</bufferSize>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %p %c - %m%n</pattern>
        </encoder>
    </appender>

    <!--異步appender-->
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
        <discardingThreshold>0</discardingThreshold>  
        <queueSize>128</queueSize>  
        <appender-ref ref ="FILE"/>  
    </appender>  
    
    <root level="info">
        <appender-ref ref="ASYNC" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

(3)log4j2:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30">
    <Appenders>

        <!--無緩存朦促,立即輸出-->
       <File name="File" fileName="e:/log.out" append="true">
            <<PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} %p %c - %m%n</Pattern>
            </PatternLayout>
        </File>

        <!--有緩存,不立即輸出-->
        <File name="File" fileName="e:/log.out" append="true"
              immediateFlush="false" bufferedIO="true" bufferSize="8192">
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} %p %c - %m%n</Pattern>
            </PatternLayout>
        </File>

       <!--異步appender-->
        <Async name="Async">
            <AppenderRef ref="File"/>
        </Async>
    </Appenders>
    <Loggers>
        <Root level="info" >
            <AppenderRef ref="Async"/>
            <AppenderRef ref="File"/>
        </Root>
        <!--異步logger-->
        <AsyncRoot level="info" >
            <AppenderRef ref="File"/>
        </AsyncRoot>
    </Loggers>
</Configuration>

1.3 結果比較(毫秒)

筆者從單線程栓始、多線程2種情況下進行的測試务冕!

無論是多線程還是單線程,在啟用緩存的情況下幻赚,系統(tǒng)性能得到了巨大的提升禀忆;

在單線程情況下,相比較來說落恼,啟用異步Appender并沒有對性能有較大的提升箩退!

值得一提的是,在log4j2中佳谦,多線程情況下戴涝,相對于同步logger來說,異步logger并沒有進一步提高系統(tǒng)的性能钻蔑,兩者不相上下啥刻;

但是,對于其他情況而言咪笑,異步logger還是有較大的提升可帽!

  • 單線程

      (1)單線程,未開啟緩存窗怒,立即刷出
      
          log4j:29772映跟、29959钝满、30911
          
          logback:25423、24552申窘、26006
          
          log4j2:37927弯蚜、38240、40164
      
      (2)單線程剃法,開啟緩存碎捺,不立即刷出
      
          log4j:9858、9677贷洲、9665
          
          logback:5561收厨、5604、5611
          
          log4j2:5782优构、5505诵叁、5499
      
      (3)單線程,異步appender,未開啟緩存钦椭,立即輸出
      
          log4j:29683拧额、29929、29385
          
          logback:33102彪腔、31779侥锦、30516
          
          log4j2:39298、39562德挣、41872
      
      (4)單線程恭垦,異步appender,開啟緩存格嗅,不立即輸出
      
          log4j:10110番挺、10068、10177
          
          logback:8753屯掖、9112玄柏、8922
          
          log4j2:8692、8400懂扼、8252
    
  • 多線程

      (1)多線程禁荸,未開啟緩存右蒲,立即刷出
    
          log4j:38541阀湿、37791、38366
      
          logback:35644瑰妄、35463陷嘴、35442
          
          log4j2:38544、38746间坐、38706
      
      (2)多線程灾挨,開啟緩存邑退,不立即刷出
    
          log4j:13296、12938劳澄、12686
          
          logback:6547地技、6294、6576
          
          log4j2:5596秒拔、5423莫矗、5421
      
      (3)多線程,異步appender,未開啟緩存砂缩,立即輸出
    
          log4j:30844作谚、32088、30734
          
          logback:44203庵芭、42191妹懒、43228
          
          log4j2:46804、46034双吆、46232
      
      (4)多線程眨唬,異步appender,開啟緩存好乐,不立即輸出
    
          log4j:10422单绑、10204、10495
          
          logback:40249曹宴、40437搂橙、40173
          
          log4j2:7832、8447笛坦、8660
    
      (5)多線程区转,異步logger,未開啟緩存版扩,立即輸出
    
          log4j2:40555废离、40245、40325
      
      
      (6)多線程礁芦,異步logger蜻韭,開啟緩存,不立即刷出
    
          log4j2:5319柿扣、5407肖方、5305
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市未状,隨后出現(xiàn)的幾起案子俯画,更是在濱河造成了極大的恐慌,老刑警劉巖司草,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艰垂,死亡現(xiàn)場離奇詭異泡仗,居然都是意外死亡,警方通過查閱死者的電腦和手機猜憎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門娩怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胰柑,你說我怎么就攤上這事峦树。” “怎么了旦事?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵魁巩,是天一觀的道長。 經(jīng)常有香客問我姐浮,道長谷遂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任卖鲤,我火速辦了婚禮肾扰,結果婚禮上,老公的妹妹穿的比我還像新娘蛋逾。我一直安慰自己集晚,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布区匣。 她就那樣靜靜地躺著偷拔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亏钩。 梳的紋絲不亂的頭發(fā)上莲绰,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音姑丑,去河邊找鬼蛤签。 笑死,一個胖子當著我的面吹牛栅哀,可吹牛的內(nèi)容都是我干的震肮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼留拾,長吁一口氣:“原來是場噩夢啊……” “哼戳晌!你這毒婦竟也來了?” 一聲冷哼從身側響起间驮,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤躬厌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竞帽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扛施,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年屹篓,在試婚紗的時候發(fā)現(xiàn)自己被綠了疙渣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡堆巧,死狀恐怖妄荔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谍肤,我是刑警寧澤啦租,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站荒揣,受9級特大地震影響篷角,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜系任,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一恳蹲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俩滥,春花似錦嘉蕾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挂据,卻和暖如春航背,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棱貌。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工玖媚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婚脱。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓今魔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親障贸。 傳聞我的和親對象是個殘疾皇子错森,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • [TOC] Java 日志框架解析:設計模式涩维、性能 在平常的系統(tǒng)開發(fā)中,日志起到了重要的作用,日志寫得好對于線上問...
    albon閱讀 4,167評論 1 8
  • log4j 1.1 簡介 Log4j是一個由Java編寫可靠瓦阐、靈活的日志框架蜗侈,是Apache旗下的一個開源項目;現(xiàn)...
    賈博巖閱讀 7,910評論 1 32
  • 在應用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況睡蟋,周期性的記錄到文件中供其他應用進行統(tǒng)計分析...
    時待吾閱讀 5,057評論 1 13
  • 在應用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況踏幻,周期性的記錄到文件中供其他應用進行統(tǒng)計分析...
    時待吾閱讀 4,991評論 0 6
  • 這是在公司內(nèi)部的一次升級實踐,刪除了很多隱私的內(nèi)容戳杀,所以可能不是很完整该面。 1、背景 在任何系統(tǒng)中信卡,日志都是非常重要...
    高廣超閱讀 10,321評論 2 35