1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package net.sourceforge.schemaspy.util;
20
21 import java.io.PrintWriter;
22 import java.io.StringWriter;
23 import java.text.DateFormat;
24 import java.text.SimpleDateFormat;
25 import java.util.Date;
26 import java.util.logging.Formatter;
27 import java.util.logging.LogRecord;
28
29
30
31
32
33
34 public class LogFormatter extends Formatter {
35 private final String lineSeparator = System.getProperty("line.separator");
36 private final int MAX_LEVEL_LEN = 7;
37 private static final String formatSpec = "HH:mm:ss.";
38
39
40
41
42
43 private static final ThreadLocal<DateFormat> dateFormatter = ThreadLocal.withInitial(() -> new SimpleDateFormat(formatSpec));
44
45
46
47
48
49 private static final ThreadLocal<Date> date = ThreadLocal.withInitial(Date::new);
50
51
52
53
54
55
56
57
58 @Override
59 public String format(LogRecord logRecord) {
60 StringBuilder buf = new StringBuilder(128);
61
62
63
64
65 date.get().setTime(logRecord.getMillis());
66 buf.append(dateFormatter.get().format(date.get()));
67
68
69 long frac = logRecord.getMillis() % 1000;
70
71
72
73 frac += 1000;
74
75
76 buf.append(Long.toString(frac).substring(1));
77
78 buf.append(" ");
79 StringBuilder level = new StringBuilder(logRecord.getLevel().getLocalizedName());
80 if (level.length() > MAX_LEVEL_LEN)
81 level.setLength(MAX_LEVEL_LEN);
82 level.append(":");
83 while (level.length() < MAX_LEVEL_LEN + 1)
84 level.append(' ');
85 buf.append(level);
86 buf.append(" ");
87
88 String name;
89 if (logRecord.getSourceClassName() != null) {
90 name = logRecord.getSourceClassName();
91 } else {
92 name = logRecord.getLoggerName();
93 }
94
95 int lastDot = name.lastIndexOf('.');
96 if (lastDot >= 0 && lastDot < name.length() - 1)
97 name = name.substring(lastDot + 1);
98 buf.append(name);
99
100 if (logRecord.getSourceMethodName() != null) {
101 buf.append('.');
102 buf.append(logRecord.getSourceMethodName());
103 }
104
105 buf.append(" - ");
106 buf.append(formatMessage(logRecord));
107 buf.append(lineSeparator);
108
109 if (logRecord.getThrown() != null) {
110 try {
111 StringWriter stacktrace = new StringWriter();
112 logRecord.getThrown().printStackTrace(new PrintWriter(stacktrace, true));
113 buf.append(stacktrace);
114
115 } catch (Exception ignore) {
116 }
117 }
118
119 return buf.toString();
120 }
121 }