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