2
2
3
3
import lombok .extern .slf4j .Slf4j ;
4
4
5
- import org .datadog .jmxfetch .util .LogLevel ;
6
- import org .datadog .jmxfetch .util .StdoutConsoleHandler ;
7
-
8
5
import java .io .PrintWriter ;
9
6
import java .io .StringWriter ;
10
7
import java .text .SimpleDateFormat ;
11
8
import java .util .Arrays ;
12
9
import java .util .Date ;
13
- import java .util .Enumeration ;
14
10
import java .util .List ;
15
11
import java .util .Locale ;
16
12
import java .util .concurrent .ConcurrentHashMap ;
17
13
import java .util .concurrent .atomic .AtomicInteger ;
18
14
import java .util .logging .ConsoleHandler ;
19
15
import java .util .logging .FileHandler ;
20
- import java .util .logging .Filter ;
21
16
import java .util .logging .Handler ;
22
17
import java .util .logging .Level ;
23
18
import java .util .logging .LogManager ;
@@ -47,8 +42,12 @@ public class CustomLogger {
47
42
private static final String DATE_JDK14_LAYOUT = "yyyy-MM-dd HH:mm:ss z" ;
48
43
private static final String DATE_JDK14_LAYOUT_RFC3339 = "yyyy-MM-dd'T'HH:mm:ssXXX" ;
49
44
private static final String JDK14_LAYOUT = "%s | JMX | %2$s | %3$s | %4$s%5$s%n" ;
45
+ private static final String JDK14_WITH_THREADS_LAYOUT =
46
+ "%s | JMX | %2$s | %3$s | %4$s | %5$s%6$s%n" ;
50
47
private static final String JDK14_LAYOUT_FILE_LINE =
51
48
"%s | JMX | %2$s | %3$s:%4$d | %5$s%6$s%n" ;
49
+ private static final String JDK14_WITH_THREADS_LAYOUT_FILE_LINE =
50
+ "%s | JMX | %2$s | %3$s | %4$s:%5$d | %6$s%7$s%n" ;
52
51
53
52
private static final int MAX_FILE_SIZE = 5 * 1024 * 1024 ;
54
53
@@ -66,67 +65,8 @@ private static boolean isStdOut(String target) {
66
65
67
66
/** setup and configure the logging. */
68
67
public static synchronized void setup (LogLevel level , String logLocation ,
69
- boolean logFormatRfc3339 ) {
70
- String target = "CONSOLE" ;
71
- String dateFormat = logFormatRfc3339 ? DATE_JDK14_LAYOUT_RFC3339 : DATE_JDK14_LAYOUT ;
72
- if (millisecondLogging ) {
73
- dateFormat = dateFormat .replace ("ss" , "ss.SSS" );
74
- }
75
- final SimpleDateFormat dateFormatter = new SimpleDateFormat (dateFormat ,
76
- Locale .getDefault ());
77
-
78
- // log format
79
- SimpleFormatter formatter = new SimpleFormatter () {
80
- private static final String format = JDK14_LAYOUT ;
81
-
82
- private String simpleClassName (String str ) {
83
- int start = str .lastIndexOf ('.' );
84
- int end = str .indexOf ('$' );
85
- if (start == -1 || start + 1 == str .length ()) {
86
- return str ;
87
- }
88
- if (end == -1 || end <= start || end > str .length ()) {
89
- end = str .length ();
90
- }
91
- return str .substring (start + 1 , end );
92
- }
93
-
94
- @ Override
95
- public synchronized String format (LogRecord lr ) {
96
- String exception = "" ;
97
- if (lr .getThrown () != null ) {
98
- StringWriter writer = new StringWriter ();
99
- PrintWriter stream = new PrintWriter (writer );
100
- stream .println ();
101
- lr .getThrown ().printStackTrace (stream );
102
- stream .close ();
103
- exception = writer .toString ();
104
- }
105
-
106
- if (enableFileLineLogging ) {
107
- Throwable throwable = new Throwable ();
108
- StackTraceElement logEmissionFrame = throwable .getStackTrace ()[6 ];
109
-
110
- return String .format (JDK14_LAYOUT_FILE_LINE ,
111
- dateFormatter .format (new Date ()).toString (),
112
- LogLevel .fromJulLevel (lr .getLevel ()).toString (),
113
- logEmissionFrame .getFileName (),
114
- logEmissionFrame .getLineNumber (),
115
- lr .getMessage (),
116
- exception
117
- );
118
-
119
- }
120
-
121
- return String .format (format ,
122
- dateFormatter .format (new Date ()).toString (),
123
- LogLevel .fromJulLevel (lr .getLevel ()).toString (),
124
- simpleClassName (lr .getSourceClassName ()),
125
- lr .getMessage (),
126
- exception
127
- );
128
- }
129
- };
68
+ boolean logFormatRfc3339 , boolean logThreadName ) {
69
+ SimpleFormatter formatter = getFormatter (logFormatRfc3339 , logThreadName );
130
70
131
71
// log level
132
72
Level julLevel = level .toJulLevel ();
@@ -138,14 +78,14 @@ public synchronized String format(LogRecord lr) {
138
78
manager .reset ();
139
79
140
80
// prepare the different handlers
141
- ConsoleHandler stdoutHandler = null ;
81
+ ConsoleHandler stdoutHandler ;
142
82
ConsoleHandler stderrHandler = null ;
143
83
FileHandler fileHandler = null ;
144
84
145
85
// the logLocation isn't always containing a file, it is sometimes
146
86
// referring to a standard output. We want to create a FileHandler only
147
87
// if the logLocation is a file on the FS.
148
- if (logLocation != null && logLocation .length () > 0 ) {
88
+ if (logLocation != null && ! logLocation .isEmpty () ) {
149
89
if (!isStdOut (logLocation ) && !isStdErr (logLocation )) {
150
90
// file logging
151
91
try {
@@ -178,14 +118,105 @@ public synchronized String format(LogRecord lr) {
178
118
if (fileHandler != null ) {
179
119
jmxfetchLogger .addHandler (fileHandler );
180
120
}
181
- if ( stdoutHandler != null ) { // always non-null but doesn't cost much
182
- jmxfetchLogger .addHandler (stdoutHandler );
183
- }
121
+
122
+ jmxfetchLogger .addHandler (stdoutHandler );
123
+
184
124
if (stderrHandler != null ) {
185
125
jmxfetchLogger .addHandler (stderrHandler );
186
126
}
187
127
}
188
128
129
+ private static SimpleFormatter getFormatter (
130
+ final boolean logFormatRfc3339 ,
131
+ final boolean logThreadName ) {
132
+ String dateFormat = logFormatRfc3339 ? DATE_JDK14_LAYOUT_RFC3339 : DATE_JDK14_LAYOUT ;
133
+ if (millisecondLogging ) {
134
+ dateFormat = dateFormat .replace ("ss" , "ss.SSS" );
135
+ }
136
+ final SimpleDateFormat dateFormatter = new SimpleDateFormat (dateFormat ,
137
+ Locale .getDefault ());
138
+
139
+ // log format
140
+ return new SimpleFormatter () {
141
+ private final String formatLayout =
142
+ logThreadName ? JDK14_WITH_THREADS_LAYOUT : JDK14_LAYOUT ;
143
+
144
+ private String simpleClassName (String str ) {
145
+ int start = str .lastIndexOf ('.' );
146
+ int end = str .indexOf ('$' );
147
+ if (start == -1 || start + 1 == str .length ()) {
148
+ return str ;
149
+ }
150
+ if (end == -1 || end <= start ) {
151
+ end = str .length ();
152
+ }
153
+ return str .substring (start + 1 , end );
154
+ }
155
+
156
+ @ Override
157
+ public synchronized String format (LogRecord lr ) {
158
+ String exception = "" ;
159
+ if (lr .getThrown () != null ) {
160
+ StringWriter writer = new StringWriter ();
161
+ PrintWriter stream = new PrintWriter (writer );
162
+ stream .println ();
163
+ lr .getThrown ().printStackTrace (stream );
164
+ stream .close ();
165
+ exception = writer .toString ();
166
+ }
167
+
168
+ if (enableFileLineLogging ) {
169
+ Throwable throwable = new Throwable ();
170
+ StackTraceElement logEmissionFrame = throwable .getStackTrace ()[6 ];
171
+
172
+ final String logFormat ;
173
+ if (logThreadName ) {
174
+ logFormat = JDK14_WITH_THREADS_LAYOUT_FILE_LINE ;
175
+ } else {
176
+ logFormat = JDK14_LAYOUT_FILE_LINE ;
177
+ }
178
+ if (logThreadName ) {
179
+ return String .format (logFormat ,
180
+ dateFormatter .format (new Date ()),
181
+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
182
+ Thread .currentThread ().getName (),
183
+ logEmissionFrame .getFileName (),
184
+ logEmissionFrame .getLineNumber (),
185
+ lr .getMessage (),
186
+ exception
187
+ );
188
+ }
189
+ return String .format (logFormat ,
190
+ dateFormatter .format (new Date ()),
191
+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
192
+ logEmissionFrame .getFileName (),
193
+ logEmissionFrame .getLineNumber (),
194
+ lr .getMessage (),
195
+ exception
196
+ );
197
+ }
198
+
199
+ if (logThreadName ) {
200
+ return String .format (formatLayout ,
201
+ dateFormatter .format (new Date ()),
202
+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
203
+ Thread .currentThread ().getName (),
204
+ simpleClassName (lr .getSourceClassName ()),
205
+ lr .getMessage (),
206
+ exception
207
+ );
208
+ }
209
+ return String .format (formatLayout ,
210
+ dateFormatter .format (new Date ()),
211
+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
212
+ simpleClassName (lr .getSourceClassName ()),
213
+ lr .getMessage (),
214
+ exception
215
+ );
216
+ }
217
+ };
218
+ }
219
+
189
220
/** closeHandlers closes all opened handlers. */
190
221
public static synchronized void shutdown () {
191
222
for (Handler handler : jmxfetchLogger .getHandlers ()) {
0 commit comments