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 package org.slf4j.bridge;
26
27 import java.util.logging.Handler;
28 import java.util.logging.LogManager;
29
30 import org.apache.log4j.FileAppender;
31 import org.apache.log4j.PatternLayout;
32 import org.junit.After;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.slf4j.LoggerFactory;
36
37 public class SLF4JBridgeHandlerPerfTest {
38
39 static String LOGGER_NAME = "yay";
40 static int RUN_LENGTH = 100 * 1000;
41
42
43 boolean disabledLogger = true;
44
45 FileAppender fileAppender;
46 org.apache.log4j.Logger log4jRoot;
47 java.util.logging.Logger julRootLogger = LogManager.getLogManager().getLogger("");
48
49 java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(LOGGER_NAME);
50 org.slf4j.Logger slf4jLogger = LoggerFactory.getLogger(LOGGER_NAME);
51
52 Handler[] existingHandlers;
53
54 @Before
55 public void setUp() throws Exception {
56 fileAppender = new FileAppender(new PatternLayout("%r [%t] %p %c %x - %m%n"), "target/test-output/toto.log");
57
58 existingHandlers = julRootLogger.getHandlers();
59 for (Handler existingHandler : existingHandlers) {
60 julRootLogger.removeHandler(existingHandler);
61 }
62 log4jRoot = org.apache.log4j.Logger.getRootLogger();
63 log4jRoot.addAppender(fileAppender);
64 }
65
66 @After
67 public void tearDown() throws Exception {
68 SLF4JBridgeHandler.uninstall();
69 fileAppender.close();
70 log4jRoot.getLoggerRepository().resetConfiguration();
71 for (Handler existingHandler : existingHandlers) {
72 julRootLogger.addHandler(existingHandler);
73 }
74 }
75
76 double julLoggerLoop() {
77 long start = System.nanoTime();
78 for (int i = 0; i < RUN_LENGTH; i++) {
79 julLogger.info("jul");
80 }
81 long end = System.nanoTime();
82 return (end - start) * 1.0 / RUN_LENGTH;
83 }
84
85 double slf4jLoggerLoop() {
86 long start = System.nanoTime();
87 for (int i = 0; i < RUN_LENGTH; i++) {
88 slf4jLogger.info("slf4j");
89 }
90 long end = System.nanoTime();
91 return (end - start) * 1.0 / RUN_LENGTH;
92 }
93
94 @Test
95 public void testPerf() {
96 SLF4JBridgeHandler.install();
97
98 if (disabledLogger) {
99 log4jRoot.setLevel(org.apache.log4j.Level.ERROR);
100 }
101 julLoggerLoop();
102 double julAvg = julLoggerLoop();
103 System.out.println("Average cost per call (JUL->SLF4J->log4j): " + julAvg + " nanos");
104
105 slf4jLoggerLoop();
106 double slf4jAvg = slf4jLoggerLoop();
107 System.out.println("Average cost per call (SLF4J->log4j): " + slf4jAvg + " nanos");
108 System.out.println("Ratio " + (julAvg / slf4jAvg));
109 }
110 }