1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.classic.multiJVM;
15
16 import org.slf4j.Logger;
17
18 import ch.qos.logback.classic.LoggerContext;
19 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
20 import ch.qos.logback.classic.spi.ILoggingEvent;
21 import ch.qos.logback.core.FileAppender;
22 import ch.qos.logback.core.testUtil.RandomUtil;
23
24 public class FileAppenderPerf {
25 static String msgLong = "ABCDEGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrstuvwxyz1234567890";
26
27 static long LEN = 100 * 1000;
28 static int DIFF = RandomUtil.getPositiveInt() % 1000;
29 static String FILENAME;
30
31 static LoggerContext buildLoggerContext(String filename, boolean safetyMode) {
32 LoggerContext loggerContext = new LoggerContext();
33
34 FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
35
36 PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
37 patternLayout.setPattern("%5p %c - %m%n");
38 patternLayout.setContext(loggerContext);
39 patternLayout.start();
40
41 fa.setEncoder(patternLayout);
42 fa.setFile(filename);
43 fa.setAppend(false);
44 fa.setPrudent(safetyMode);
45 fa.setContext(loggerContext);
46 fa.start();
47
48 ch.qos.logback.classic.Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
49 root.addAppender(fa);
50
51 return loggerContext;
52 }
53
54 static void usage(String msg) {
55 System.err.println(msg);
56 System.err.println("Usage: java " + FileAppenderPerf.class.getName() + " filename");
57
58 System.exit(1);
59 }
60
61 public static void main(String[] argv) throws Exception {
62 if (argv.length > 1) {
63 usage("Wrong number of arguments.");
64 }
65
66 if (argv.length == 0) {
67 FILENAME = DIFF + "";
68 } else {
69 FILENAME = argv[0];
70 }
71
72 perfCase(false);
73 perfCase(true);
74 }
75
76 static void perfCase(boolean safetyMode) throws Exception {
77 LoggerContext lc = buildLoggerContext(FILENAME + "-" + safetyMode + ".log", safetyMode);
78 Logger logger = lc.getLogger(FileAppenderPerf.class);
79
80 long start = System.nanoTime();
81 for (int i = 0; i < LEN; i++) {
82 logger.debug(msgLong + " " + i);
83 }
84
85 double durationPerLog = (System.nanoTime() - start) / (LEN * 1000.0);
86
87 lc.stop();
88
89 System.out.println(
90 "Average duration of " + (durationPerLog) + " microseconds per log. Prudent mode=" + safetyMode);
91 System.out.println("------------------------------------------------");
92 }
93
94 }