22
33import lombok .extern .slf4j .Slf4j ;
44
5- import org .datadog .jmxfetch .util .LogLevel ;
6- import org .datadog .jmxfetch .util .StdoutConsoleHandler ;
7-
85import java .io .PrintWriter ;
96import java .io .StringWriter ;
107import java .text .SimpleDateFormat ;
118import java .util .Arrays ;
129import java .util .Date ;
13- import java .util .Enumeration ;
1410import java .util .List ;
1511import java .util .Locale ;
1612import java .util .concurrent .ConcurrentHashMap ;
1713import java .util .concurrent .atomic .AtomicInteger ;
1814import java .util .logging .ConsoleHandler ;
1915import java .util .logging .FileHandler ;
20- import java .util .logging .Filter ;
2116import java .util .logging .Handler ;
2217import java .util .logging .Level ;
2318import java .util .logging .LogManager ;
@@ -41,14 +36,24 @@ public class CustomLogger {
4136 private static boolean millisecondLogging =
4237 System .getProperty ("jmxfetch.millisecondLogging" , "false" ).equals ("true" );
4338
39+ // Enable by setting -Djmxfetch.disableThreadLogging,
40+ // if true, log record will not include thread name
41+ private static final boolean disableThreadLogging =
42+ System .getProperty ("jmxfetch.disableThreadLogging" , "false" ).equals ("true" );
43+
4444 private static final ConcurrentHashMap <String , AtomicInteger > messageCount
4545 = new ConcurrentHashMap <String , AtomicInteger >();
4646
4747 private static final String DATE_JDK14_LAYOUT = "yyyy-MM-dd HH:mm:ss z" ;
4848 private static final String DATE_JDK14_LAYOUT_RFC3339 = "yyyy-MM-dd'T'HH:mm:ssXXX" ;
49- private static final String JDK14_LAYOUT = "%s | JMX | %2$s | %3$s | %4$s%5$s%n" ;
49+ private static final String JDK14_LAYOUT =
50+ "%s | JMX | %2$s | %3$s | %4$s%5$s%n" ;
51+ private static final String JDK14_WITH_THREADS_LAYOUT =
52+ "%s | JMX | %2$s | %3$s | %4$s | %5$s%6$s%n" ;
5053 private static final String JDK14_LAYOUT_FILE_LINE =
51- "%s | JMX | %2$s | %3$s:%4$d | %5$s%6$s%n" ;
54+ "%s | JMX | %2$s | %3$s:%4$d | %5$s%6$s%n" ;
55+ private static final String JDK14_WITH_THREADS_LAYOUT_FILE_LINE =
56+ "%s | JMX | %2$s | %3$s | %4$s:%5$d | %6$s%7$s%n" ;
5257
5358 private static final int MAX_FILE_SIZE = 5 * 1024 * 1024 ;
5459
@@ -67,66 +72,7 @@ private static boolean isStdOut(String target) {
6772 /** setup and configure the logging. */
6873 public static synchronized void setup (LogLevel level , String logLocation ,
6974 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- };
75+ SimpleFormatter formatter = getFormatter (logFormatRfc3339 );
13076
13177 // log level
13278 Level julLevel = level .toJulLevel ();
@@ -138,14 +84,14 @@ public synchronized String format(LogRecord lr) {
13884 manager .reset ();
13985
14086 // prepare the different handlers
141- ConsoleHandler stdoutHandler = null ;
87+ ConsoleHandler stdoutHandler ;
14288 ConsoleHandler stderrHandler = null ;
14389 FileHandler fileHandler = null ;
14490
14591 // the logLocation isn't always containing a file, it is sometimes
14692 // referring to a standard output. We want to create a FileHandler only
14793 // if the logLocation is a file on the FS.
148- if (logLocation != null && logLocation .length () > 0 ) {
94+ if (logLocation != null && ! logLocation .isEmpty () ) {
14995 if (!isStdOut (logLocation ) && !isStdErr (logLocation )) {
15096 // file logging
15197 try {
@@ -178,14 +124,97 @@ public synchronized String format(LogRecord lr) {
178124 if (fileHandler != null ) {
179125 jmxfetchLogger .addHandler (fileHandler );
180126 }
181- if ( stdoutHandler != null ) { // always non-null but doesn't cost much
182- jmxfetchLogger .addHandler (stdoutHandler );
183- }
127+
128+ jmxfetchLogger .addHandler (stdoutHandler );
129+
184130 if (stderrHandler != null ) {
185131 jmxfetchLogger .addHandler (stderrHandler );
186132 }
187133 }
188134
135+ private static SimpleFormatter getFormatter (
136+ final boolean logFormatRfc3339 ) {
137+ String dateFormat = logFormatRfc3339 ? DATE_JDK14_LAYOUT_RFC3339 : DATE_JDK14_LAYOUT ;
138+ if (millisecondLogging ) {
139+ dateFormat = dateFormat .replace ("ss" , "ss.SSS" );
140+ }
141+ final SimpleDateFormat dateFormatter = new SimpleDateFormat (dateFormat ,
142+ Locale .getDefault ());
143+
144+ // log format
145+ return new SimpleFormatter () {
146+
147+ private String simpleClassName (String str ) {
148+ int start = str .lastIndexOf ('.' );
149+ int end = str .indexOf ('$' );
150+ if (start == -1 || start + 1 == str .length ()) {
151+ return str ;
152+ }
153+ if (end == -1 || end <= start ) {
154+ end = str .length ();
155+ }
156+ return str .substring (start + 1 , end );
157+ }
158+
159+ @ Override
160+ public synchronized String format (LogRecord lr ) {
161+ String exception = "" ;
162+ if (lr .getThrown () != null ) {
163+ StringWriter writer = new StringWriter ();
164+ PrintWriter stream = new PrintWriter (writer );
165+ stream .println ();
166+ lr .getThrown ().printStackTrace (stream );
167+ stream .close ();
168+ exception = writer .toString ();
169+ }
170+
171+ if (enableFileLineLogging ) {
172+ Throwable throwable = new Throwable ();
173+ StackTraceElement logEmissionFrame = throwable .getStackTrace ()[6 ];
174+
175+ if (!disableThreadLogging ) {
176+ return String .format (JDK14_WITH_THREADS_LAYOUT_FILE_LINE ,
177+ dateFormatter .format (new Date ()),
178+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
179+ Thread .currentThread ().getName (),
180+ logEmissionFrame .getFileName (),
181+ logEmissionFrame .getLineNumber (),
182+ lr .getMessage (),
183+ exception
184+ );
185+ }
186+
187+ return String .format (JDK14_LAYOUT_FILE_LINE ,
188+ dateFormatter .format (new Date ()),
189+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
190+ logEmissionFrame .getFileName (),
191+ logEmissionFrame .getLineNumber (),
192+ lr .getMessage (),
193+ exception
194+ );
195+ }
196+
197+ if (!disableThreadLogging ) {
198+ return String .format (JDK14_WITH_THREADS_LAYOUT ,
199+ dateFormatter .format (new Date ()),
200+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
201+ Thread .currentThread ().getName (),
202+ simpleClassName (lr .getSourceClassName ()),
203+ lr .getMessage (),
204+ exception
205+ );
206+ }
207+ return String .format (JDK14_LAYOUT ,
208+ dateFormatter .format (new Date ()),
209+ LogLevel .fromJulLevel (lr .getLevel ()).toString (),
210+ simpleClassName (lr .getSourceClassName ()),
211+ lr .getMessage (),
212+ exception
213+ );
214+ }
215+ };
216+ }
217+
189218 /** closeHandlers closes all opened handlers. */
190219 public static synchronized void shutdown () {
191220 for (Handler handler : jmxfetchLogger .getHandlers ()) {
0 commit comments