日志效率对比 -- log4j log42 logback

实例测试不同日志框架性能, 通过修改BaseLogInfo中的线程数和数据总数,可以测试不同量级情况下,性能的差距。

依赖:

<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.5</version>
        </dependency>

        <!-- LogBack -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>

 

配置文件:

log4j:

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

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="INFO" class="org.apache.log4j.DailyRollingFileAppender">

        <param name="File" value="./logs/log4j.log"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p %C [%t] $m$n"/>
        </layout>
    </appender>

    <appender name="ASYNC-INFO" class="org.apache.log4j.AsyncAppender">
        <param name="BufferSize" value="512"/>
        <param name="locationInfo" value="true"/>
        <appender-ref ref="INFO"/>
    </appender>

    <root>
        <priority value="debug"/>
<!--        &lt;!&ndash;同步日志&ndash;&gt;-->
<!--        <appender-ref ref="INFO"/>-->
        <!--异步日志-->
        <appender-ref ref="ASYNC-INFO"/>
    </root>
</log4j:configuration>

log4j2

<?xml version="1.0" encoding="utf-8" ?>
<Configuration status="debug" strict="true" name="XMLConfigTest">
    <Properties>
        <Property name="filename">./logs/log4j2.log</Property>
    </Properties>

    <Appenders>
        <RandomAccessFile name="INFO" fileName="${filename}"
                          immediateFlush="false" append="true">

            <PatternLayout>
                <Pattern>%d %p %C [%t] %m%n</Pattern>
            </PatternLayout>
        </RandomAccessFile>
    </Appenders>

    <Loggers>
        <!--同步日志-->
<!--        <Root level="debug" additivity="false">-->
<!--            <AppenderRef ref="INFO"/>-->
<!--        </Root>-->
        <!--异步日志-->
        <AsyncRoot level="debug" additivity="false" includeLocation="true" bufferSize="512">
            <AppenderRef ref="INFO"/>
        </AsyncRoot>
    </Loggers>
</Configuration>

logback:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <timestamp key="timestamp" datePattern="yyyyMMddHHmm"/>

    <property name="SYSTEM_LOG_FOLDER" value="/Users/yangmingyue/logefficiency/logs"/>

    <property name="SYSTEM_LOG_NAME" value="system"/>

    <property name="pattern" value="%msg%n"/>

    <!-- 按照每天生成日志文件 -->
    <appender name="SYSTEM_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${SYSTEM_LOG_FOLDER}/${SYSTEM_LOG_NAME}.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${SYSTEM_LOG_FOLDER}/${SYSTEM_LOG_NAME}_%d{yyyyMMdd}.%i.log</fileNamePattern>
            <maxHistory>1</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <appender name="ASYNC-SYSTEM" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>512</queueSize>
        <appender-ref ref="SYSTEM"/>
        <includeCallerData>true</includeCallerData>
    </appender>

<!--    <logger name="SYSTEM" level="debug" additivity="false">-->
<!--        <appender-ref ref="SYSTEM_LOG"/>-->
<!--    </logger>-->

    <!-- 日志输出级别 -->
    <root level="DEBUG">
<!--        &lt;!&ndash;同步日志&ndash;&gt;-->
<!--        <appender-ref ref="SYSTEM_LOG"/>-->
        <!--异步日志-->
        <appender-ref ref="ASYNC-SYSTEM"/>
    </root>

</configuration>

 

测试类:

基础类:

public class BaseLogInfo {

    public final static int TOTAL_THREAD = 50;
    public final static int TOTAL_DATA_SIZE = 1000000;
}

 

TestLog4j

import org.apache.log4j.Logger;

import java.util.concurrent.CountDownLatch;

public class TestLog4j extends BaseLogInfo{

    private static final Logger logger = Logger.getLogger(TestLog4j.class);

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

        System.out.println("Log4j 100万 start fixedPrinting");
        final CountDownLatch cdt = new CountDownLatch(TOTAL_THREAD);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < TOTAL_THREAD; i++) {

            new Thread(new Runnable() {
                public void run() {

                    for (int i = 0; i < TOTAL_DATA_SIZE/TOTAL_THREAD; i++) {

                        logger.info("Hello world FixedPrinting");
                    }

                    cdt.countDown();
                }
            }).start();
        }
        cdt.await();
        long endTime = System.currentTimeMillis();
        System.out.println("log4j 100万 : " + (endTime - startTime) + "ms");
    }
}

TestLog4j2


import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.concurrent.CountDownLatch;

public class TestLog4j2 extends BaseLogInfo{

    private static final Logger logger = LogManager.getLogger(TestLog4j2.class);

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

        System.out.println("Log4j2 100万 start fixedPrinting");
        final CountDownLatch cdt = new CountDownLatch(TOTAL_THREAD);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < TOTAL_THREAD; i++) {

            new Thread(new Runnable() {
                public void run() {

                    for (int i = 0; i < TOTAL_DATA_SIZE/TOTAL_THREAD; i++) {

                        logger.info("Hello world FixedPrinting");
                    }

                    cdt.countDown();
                }
            }).start();
        }
        cdt.await();
        long endTime = System.currentTimeMillis();
        System.out.println("log4j2 100万 : " + (endTime - startTime) + "ms");
    }
}

 

TestLogback

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;

public class TestLogback extends BaseLogInfo{

    private static final Logger logger = LoggerFactory.getLogger(TestLog4j2.class);

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

        System.out.println("Logback 100万 start fixedPrinting");
        final CountDownLatch cdt = new CountDownLatch(TOTAL_THREAD);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < TOTAL_THREAD; i++) {

            new Thread(new Runnable() {
                public void run() {

                    for (int i = 0; i < TOTAL_DATA_SIZE/TOTAL_THREAD; i++) {

                        logger.info("Hello world FixedPrinting");
                    }

                    cdt.countDown();
                }
            }).start();
        }
        cdt.await();
        long endTime = System.currentTimeMillis();
        System.out.println("logback 100万 : " + (endTime - startTime) + "ms");
    }
}

一百万条数据写入, 50个线程。

在都是异步的情况下:

Logback 100万 start fixedPrinting
logback 100万 : 11672ms

Log4j2 100万 start fixedPrinting
log4j2 100万 : 34ms

Log4j 100万 start fixedPrinting
log4j 100万 : 12021ms

同步情况下:

Logback 100万 start fixedPrinting
logback 100万 : 14642ms

Log4j2 100万 start fixedPrinting
log4j2 100万 : 5330ms

Log4j 100万 start fixedPrinting
log4j 100万 : 26372ms

 

测试结果可知:

同步情况下:log4j2 效率最高,时间最短

异步情况下:log4j2效率也是最高,时间最短,而且能看出,效率比其他高出很多

异步情况下,log4j2 时间变化最大

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨愁心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值