天涯论坛

 找回密码
 立即注册
搜索
查看: 16|回复: 2

Log4j1、Logback 以及 Log4j2 性能测试对

[复制链接]

3077

主题

148

回帖

9911万

积分

论坛元老

Rank: 8Rank: 8

积分
99118886
发表于 2024-10-8 14:33:03 | 显示全部楼层 |阅读模式

点击上方“芋道源码”,选取“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

 

精尽 Dubbo 原理与源码 69 篇

精尽 Netty 原理与源码 61 篇

中文仔细注释的开源项目

Java 并发源码合集

RocketMQ 源码合集

Sharding-JDBC 源码解析合集

Spring MVC 和 Security 源码合集

MyCAT 源码解析合集

源自:https://dwz.cn/woS9vbcQ

环境

准备

测试

结果

环境

jdk:1.7.0_79

cpu:i5-4570@3.20GHz 4核

eclipse:3.7

操作系统:win7

准备

1.log4j:1.7.21

<dependency>        <groupId>org.slf4j</groupId>    <artifactId>slf4j-log4j12</artifactId>    <version>1.7.21</version></dependency>

log4j.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j=http://jakarta.apache.org/log4j/>    <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n"/>        </layout>        <!--过滤器设置输出的级别 -->        <filter class="org.apache.log4j.varia.LevelRangeFilter">            <param name="levelMin" value="debug" />            <param name="levelMax" value="warn" />            <param name="AcceptOnMatch" value="true" />        </filter>    </appender>    <appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender">        <param name="File" value="log4jTest.log" />        <param name="Append" value="true" />        <param name="DatePattern" value=".yyyy-MM-dd.log" />        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%t] - %m%n" />        </layout>    </appender>    <appender name="async_file" class="org.apache.log4j.AsyncAppender">        <param name="BufferSize" value="32" />        <appender-ref ref="myFile" />    </appender>    <logger name="org.logTest" additivity="false">        <level value="info" />        <appender-ref ref="async_file" /> <!-- 同步:FILE 异步:async_file -->    </logger></log4j:configuration>

2.logback:1.1.7

<dependency>    <groupId>ch.qos.logback</groupId>    <artifactId>logback-classic</artifactId>    <version>1.1.7</version></dependency>

logback.xml

<configuration>    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        <!-- encoder 默认配置为PatternLayoutEncoder -->        <encoder>            <pattern>

%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

            </pattern>        </encoder>    </appender>    <appender name="FILE" class="ch.qos.logback.core.FileAppender">        <file>testFile.log</file>        <append>true</append>        <encoder>            <pattern>

[%t] - %m%n

            </pattern>        </encoder>    </appender>    <!-- 异步输出 -->    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">        <discardingThreshold>0</discardingThreshold>        <appender-ref ref="FILE" />    </appender>    <logger name="org.logTest" level="INFO"        additivity="false">        <appender-ref ref="ASYNC" />  <!-- 同步:FILE 异步:ASYNC-->    </logger>    <root level="ERROR">        <appender-ref ref="STDOUT" />    </root></configuration>

3.log4j2:2.6.2

<dependency>    <groupId>org.apache.logging.log4j</groupId>    <artifactId>log4j-core</artifactId>    <version>2.6.2</version></dependency><dependency>    <groupId>org.apache.logging.log4j</groupId>    <artifactId>log4j-slf4j-impl</artifactId>    <version>2.6.2</version></dependency><dependency>    <groupId>com.lmax</groupId>    <artifactId>disruptor</artifactId>    <version>3.3.4</version></dependency>

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?><!--设置log4j2的自己log级别为warn --><configuration status="warn">    <appenders>         <console name="Console" target="SYSTEM_OUT">            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />        </console>        <RollingFile name="RollingFileInfo" fileName="info.log"            filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">            <Filters>                <ThresholdFilter level="INFO" />                <ThresholdFilter level="WARN" onMatch="DENY"                    onMismatch="NEUTRAL" />            </Filters>            <PatternLayout pattern="[%t] - %m%n" />            <Policies>                <TimeBasedTriggeringPolicy />                <SizeBasedTriggeringPolicy size="100 MB" />            </Policies>        </RollingFile>        <RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log"            immediateFlush="false" append="true">            <PatternLayout>                <Pattern>[%t] - %m%n</Pattern>            </PatternLayout>        </RandomAccessFile>    </appenders>    <loggers>        

            includeLocation="true">

        </AsyncLogger> -->
        <Root level="info" includeLocation="true">            <AppenderRef ref="RollingFileInfo" />        </Root>    </loggers></configuration>

测试

准备50条线程同期记录1000000条数据,而后统计时间,仔细代码如下:

import

java.util.concurrent.CountDownLatch;

import

 org.slf4j.Logger;

import

 org.slf4j.LoggerFactory;

public class App 

{

    private static

 Logger log = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) throws InterruptedException 

{

        int messageSize = 1000000

;

        int threadSize = 50

;

        final int

 everySize = messageSize / threadSize;

        finalCountDownLatch cdl =new

 CountDownLatch(threadSize);

        long

 startTime = System.currentTimeMillis();

        for (int ts = 0

; ts < threadSize; ts++) {

            new Thread(new

 Runnable() {

                @Override                public void run() 

{

                    for (int es = 0

; es < everySize; es++) {

                        log.info("======info"

);

                    }

                    cdl.countDown();

                }

            }).start();

        }

        cdl.await();

        long

endTime = System.currentTimeMillis();

        System.out.println("log4j1:messageSize = "

 + messageSize

                + ",threadSize = " + threadSize + ",costTime = "                + (endTime - startTime) + "ms"

);

    }

}

log4j1和logback的同步和异步分别修改为对应的appender就行了

log4j2的异步方式供给了2中模式:

1.全局开启

设置Log4jContextSelector系统属性为:

org.apache.logging.log4j.core.async.AsyncLoggerContextSelectorSystem.setProperty("Log4jContextSelector""org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"

);

2.混合同步异步模式

不需要设置Log4jContextSelector,然则需要运用AsyncLogger标签

更加多仔细参考官方文档:http://logging.apache.org/log4j/2.x/manual/async.html#AllAsync

结果

分别测试完以后统计成表格如下:

img

log4j2的异步模式表现了绝对的性能优良优良重点得益于Disruptor框架的运用

LMAX Disruptor technology. Asynchronous Loggers internallyuse the Disruptor, a lock-free inter-thread communication library, instead of queues, resulting inhigher throughputand lower

 latency.

一个无锁的线程间通信库代替了原来的队列

更加多Disruptor :

http://developer.51cto.com/art/201306/399370.htm

http://ifeve.com/disruptor/

欢迎加入我的知识星球,一块探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:





上一篇:自我手帐Goods种草安利大会
下一篇:采集器是什么意思(采集器是干吗的)
回复

使用道具 举报

3139

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968622
发表于 2024-11-1 11:15:50 | 显示全部楼层
回顾历史,我们不难发现:无数先辈用鲜血和生命铺就了中华民族复兴的康庄大道。
回复

使用道具 举报

3091

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098764
发表于 昨天 21:32 | 显示全部楼层
你的话语如春风拂面,温暖了我的心房,真的很感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 17:02 , Processed in 0.126561 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.