Logback及Log4J性能测试

分别从两个方面测试:

1、日志输出的格式对性能的影响,即日志中包含动态方法名和行号对性能的影响

2、日志长度对性能的影响

LogBack测试

本测试在Spring Boot框架基础上进行,日志配置文件logback-spring.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
	<property name="log.path" value="D:\\log\\eurekaServer\\" />
	<!-- 不带方法名和行号 -->
	<appender name="LOGFILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<File>${log.path}/eurekaServer.log</File>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/eurekaServer-%d{yyyyMMdd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>50MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<maxHistory>60</maxHistory>
			<totalSizeCap>20GB</totalSizeCap>
		</rollingPolicy>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%-14.14thread] %-30.30logger{30} - %msg%n </pattern>
		</layout>
	</appender>
	<root level="info">
		<appender-ref ref="LOGFILE" />
	</root>
	<logger name="com.EurekaServer" level="INFO" additivity="false">
		<appender-ref ref="LOGFILE" />
	</logger>
</configuration>  

只带行号:

%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%-14.14thread] %-30.30logger{30} %-4line - %msg%n

只带方法名:

%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%-14.14thread] %-30.30logger{30} [%-20.20method] - %msg%n 

带方法名和行号:

%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%-14.14thread] %-30.30logger{30} [%-20.20method]:%-4line - %msg%n 


因为基于Spring Boot,所以只需在测试类外面加上如下两个注解即可:

@RunWith(SpringRunner.class)
@SpringBootTest


整个测试类内容如下:

import java.util.ArrayList;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.perf4j.StopWatch;
import org.perf4j.slf4j.Slf4JStopWatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class EurekaServerApplicationTests {
    Logger log = LoggerFactory.getLogger(EurekaServerApplicationTests.class);  

	@Ignore
	@Test
	public void contextLoads() {
	}

//	@Ignore
	@Test  
    public void logMehodAndLine() throws InterruptedException{  
        StopWatch watch = new Slf4JStopWatch();  
        List<Long> times = new ArrayList<Long>();  
        int n = 10;  
        int size = 1000000;  
        Long totalTime = 0L;  
        for(int i = 0;i<n;i++){  
            watch.start();  
            for(int j = 0;j<size - 1;j++){  
                log.info("Example message");  
            }  
            watch.stop();  
            times.add(i, watch.getElapsedTime());  
            totalTime += watch.getElapsedTime();  
            Thread.sleep(500);  
        }  
        log.info("{}条耗时:{}ms",size,times.toString());  
        log.info("平均每{}条耗时:{}ms",size,totalTime/n);  
    }  
      
    /** 
     * 测试日志长度对时间的影响 
     */  
	@Ignore  
    @Test  
    public void logLength() throws InterruptedException{  
        StopWatch watch = new Slf4JStopWatch();  
        List<Long> times = new ArrayList<Long>();  
        int n = 50;  
        int size = 10000;  
        int length = 1000;  
        StringBuffer info = new StringBuffer();  
        log.info("开始。。。。");
        for(int i = 0;i < n; i++){  
            while(info.length()<(i+1)*length){  
                info.append("a");  
            }  
            String infoStr = info.toString();  
            watch.start();  
            for(int j = 0;j<size - 1;j++){  
                log.info(infoStr);  
            }  
            watch.stop();  
            times.add(i, watch.getElapsedTime());  
            Thread.sleep(500);  
        }  
        for(int i = 0;i < n; i++){  
            log.info("长度为{}时,{}条共耗时:{}ms",(i+1)*length,size,times.get(i));  
        }  
    }  
}



日志输出的格式对性能的影响

包含行号测试结果:

2017-12-17 16:47:28.795 INFO  [main          ] E.EurekaServerApplicationTests 42   - 1000000条耗时:[55742, 55179, 54539, 55101, 56176, 56494, 56571, 55494, 55828, 56417]ms
2017-12-17 16:47:28.795 INFO  [main          ] E.EurekaServerApplicationTests 43   - 平均每1000000条耗时:55754ms

包含动态方法名测试结果:

2017-12-17 17:19:46.811 INFO  [main          ] E.EurekaServerApplicationTests [logMehodAndLine     ] - 1000000条耗时:[56293, 55258, 54957, 55100, 55357, 53849, 55144, 55342, 54842, 56428]ms
2017-12-17 17:19:46.811 INFO  [main          ] E.EurekaServerApplicationTests [logMehodAndLine     ] - 平均每1000000条耗时:55257ms

同时包含动态方法名和行号的测试结果:

2017-12-17 17:35:27.582 INFO  [main          ] E.EurekaServerApplicationTests [logMehodAndLine     ]:42   - 1000000条耗时:[59606, 57803, 57607, 57038, 58981, 57819, 58784, 58220, 60550, 57470]ms
2017-12-17 17:35:27.583 INFO  [main          ] E.EurekaServerApplicationTests [logMehodAndLine     ]:43   - 平均每1000000条耗时:58387ms

不包含动态方法名和行号的测试结果:

2017-12-17 17:49:30.144 INFO  [main          ] E.EurekaServerApplicationTests - 1000000条耗时:[3877, 3425, 3189, 3002, 4061, 3372, 3767, 3138, 4020, 2914]ms
2017-12-17 17:49:30.144 INFO  [main          ] E.EurekaServerApplicationTests - 平均每1000000条耗时:3476ms


可见,同时包含方法名和行号的时间与只包含方法名或行号差不多,但都比不包含方法名和行号需要的时间多,大概为16倍。


日志长度对性能的影响

以包含方法名和行号、输出到文件为例

测试结果:

n=50、size = 10000、length = 1000时:

2017-12-17 15:35:55.726 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为1000时,10000条共耗时:884ms
2017-12-17 15:35:55.726 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为2000时,10000条共耗时:769ms
2017-12-17 15:35:55.726 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为3000时,10000条共耗时:1009ms
2017-12-17 15:35:55.726 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为4000时,10000条共耗时:1050ms
2017-12-17 15:35:55.726 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为5000时,10000条共耗时:805ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为6000时,10000条共耗时:835ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为7000时,10000条共耗时:956ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为8000时,10000条共耗时:776ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为9000时,10000条共耗时:1016ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为10000时,10000条共耗时:1054ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为11000时,10000条共耗时:1172ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为12000时,10000条共耗时:1189ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为13000时,10000条共耗时:1078ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为14000时,10000条共耗时:1780ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为15000时,10000条共耗时:2187ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为16000时,10000条共耗时:2096ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为17000时,10000条共耗时:2072ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为18000时,10000条共耗时:3175ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为19000时,10000条共耗时:3202ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为20000时,10000条共耗时:3065ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为21000时,10000条共耗时:3867ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为22000时,10000条共耗时:2614ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为23000时,10000条共耗时:3466ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为24000时,10000条共耗时:4425ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为25000时,10000条共耗时:5366ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为26000时,10000条共耗时:6404ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为27000时,10000条共耗时:6481ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为28000时,10000条共耗时:5930ms
2017-12-17 15:35:55.810 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为29000时,10000条共耗时:6752ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为30000时,10000条共耗时:5903ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为31000时,10000条共耗时:6539ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为32000时,10000条共耗时:8695ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为33000时,10000条共耗时:8874ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为34000时,10000条共耗时:10502ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为35000时,10000条共耗时:11454ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为36000时,10000条共耗时:11974ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为37000时,10000条共耗时:11695ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为38000时,10000条共耗时:12955ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为39000时,10000条共耗时:13296ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为40000时,10000条共耗时:13684ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为41000时,10000条共耗时:13281ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为42000时,10000条共耗时:14756ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为43000时,10000条共耗时:14626ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为44000时,10000条共耗时:17325ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为45000时,10000条共耗时:18513ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为46000时,10000条共耗时:21122ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为47000时,10000条共耗时:16580ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为48000时,10000条共耗时:15385ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为49000时,10000条共耗时:16923ms
2017-12-17 15:35:55.826 INFO  [main          ] E.EurekaServerApplicationTests [logLength           ]:75   - 长度为50000时,10000条共耗时:17295ms

结论:时间会随着长度增加而增加


Log4J测试:

效果应该差不多






LogbackLog4j都是Java平台上的日志框架,它们各有优缺点,下面是它们的横向比较: 1. Logback的优点: - 配置简单:Logback的配置文件非常容易理解和配置,可以快速地进行日志配置。 - 性能高:Logback的性能比Log4j更好,可以处理更多的日志信息。 - 灵活性高:Logback可以通过编程方式进行配置,也可以通过XML文件进行配置。 - 可扩展性好:Logback提供了多种Appender和Layout,可以满足各种不同的日志需求。 - 支持SLF4J:Logback是SLF4J的实现,可以与其他框架无缝集成。 2. Logback的缺点: - 社区相对小:相比于Log4jLogback的社区规模相对较小,可能会影响到一些开发者的选择。 - 需要熟悉XML:Logback的配置文件是基于XML格式的,需要熟悉XML的语法和规范。 3. Log4j的优点: - 成熟稳定:Log4j是Java平台上最早的日志框架之一,已经经过了长时间的发展和测试,非常成熟和稳定。 - 功能丰富:Log4j提供了非常丰富的日志功能,包括多种Appender和Layout等。 - 社区活跃:Log4j有一个庞大的社区,有很多的用户和开发者活跃在其中,可以及时得到支持和帮助。 4. Log4j的缺点: - 性能相对较差:相比于LogbackLog4j的性能稍差一些,可能会对系统性能产生一定的影响。 - 配置相对复杂:Log4j的配置文件相对于Logback来说稍微复杂一些,需要花费一些时间进行学习和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值