001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.microservice.jetty;
018
019import static java.util.logging.Level.*;
020import static org.apache.juneau.common.utils.Utils.*;
021
022import java.util.logging.*;
023import java.util.logging.Logger;
024
025import org.slf4j.*;
026import org.slf4j.spi.*;
027
028/**
029 * Implementation of Jetty {@link Logger} based on {@link java.util.logging.Logger}.
030 *
031 * <p>
032 * Allows Jetty to log to the Java Util logging framework (and thus to the main log file defined in the
033 * <cc>[Logging]</cc> section).
034 *
035 * <p>
036 * Can be used by setting the following system property in the microservice config file.
037 *
038 * <p class='bini'>
039 *    <cs>[SystemProperties]</cs>
040 *
041 *    <cc># Configure Jetty to log using java-util logging</cc>
042 *    <ck>org.eclipse.jetty.util.log.class</ck> = org.apache.juneau.microservice.jetty.JettyLogger
043 * </p>
044 *
045 * <h5 class='section'>See Also:</h5><ul>
046 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauMicroserviceJettyBasics">juneau-microservice-jetty Basics</a>
047 * </ul>
048 */
049public class JettyLogger implements LocationAwareLogger {
050   private static final boolean SHOW_SOURCE = env("org.eclipse.jetty.util.log.SOURCE", env("org.eclipse.jetty.util.log.javautil.SOURCE", true));
051
052   private Level configuredLevel;
053   private Logger logger;
054
055   /**
056    * Default constructor.
057    *
058    * <p>
059    * Returns the logger with name <js>"org.eclipse.jetty.util.log.javautil"</js>.
060    */
061   public JettyLogger() {
062      this("org.eclipse.jetty.util.log.javautil");
063   }
064
065   /**
066    * Normal constructor.
067    *
068    * @param name The logger name.
069    */
070   public JettyLogger(String name) {
071      logger = Logger.getLogger(name);
072      configuredLevel = logger.getLevel();
073   }
074
075   public JettyLogger getLogger(String name) {
076      return new JettyLogger(name);
077   }
078
079   @Override
080   public String getName() {
081      return logger.getName();
082   }
083
084   @Override
085   public void warn(String msg, Object... args) {
086      if (isLoggable(WARNING))
087         log(WARNING, format(msg, args), null);
088   }
089
090   public void warn(Throwable thrown) {
091      if (isLoggable(WARNING))
092         log(WARNING, "", thrown);
093   }
094
095   @Override
096   public void warn(String msg, Throwable thrown) {
097      if (isLoggable(WARNING))
098         log(WARNING, msg, thrown);
099   }
100
101   @Override
102   public void info(String msg, Object... args) {
103      if (isLoggable(INFO))
104         log(INFO, format(msg, args), null);
105   }
106
107   public void info(Throwable thrown) {
108      if (isLoggable(INFO))
109         log(INFO, "", thrown);
110   }
111
112   @Override
113   public void info(String msg, Throwable thrown) {
114      if (isLoggable(INFO))
115         log(INFO, msg, thrown);
116   }
117
118   @Override
119   public boolean isDebugEnabled() {
120      return isLoggable(FINE);
121   }
122
123   public void setDebugEnabled(boolean enabled) {
124      if (enabled) {
125         configuredLevel = logger.getLevel();
126         logger.setLevel(FINE);
127      } else {
128         logger.setLevel(configuredLevel);
129      }
130   }
131
132   @Override
133   public void debug(String msg, Object... args) {
134      if (isLoggable(FINE))
135         log(FINE, format(msg, args), null);
136   }
137
138   public void debug(String msg, long arg) {
139      if (isLoggable(FINE))
140         log(FINE, format(msg, arg), null);
141   }
142
143   public void debug(Throwable thrown) {
144      if (isLoggable(FINE))
145         log(FINE, "", thrown);
146   }
147
148   @Override
149   public void debug(String msg, Throwable thrown) {
150      if (isLoggable(FINE))
151         log(FINE, msg, thrown);
152   }
153
154   public void ignore(Throwable ignored) {
155      if (isLoggable(FINEST))
156         log(FINEST, "IGNORED EXCEPTION ", ignored);
157   }
158
159   private static String format(String msg, Object... args) {
160      msg = String.valueOf(msg);
161      if (args.length == 0)
162         return msg;
163      StringBuilder sb = new StringBuilder();
164      int start = 0;
165      for (Object arg : args) {
166         int bi = msg.indexOf("{}", start);
167         if (bi < 0) {
168            sb.append(msg.substring(start)).append(" ").append(arg);
169            start = msg.length();
170         } else {
171            sb.append(msg.substring(start, bi)).append(String.valueOf(arg));
172            start = bi + 2;
173         }
174      }
175      sb.append(msg.substring(start));
176      return sb.toString();
177   }
178
179   private void log(Level level, String msg, Throwable thrown) {
180      LogRecord r = new LogRecord(level, msg);
181      if (thrown != null)
182         r.setThrown(thrown);
183      r.setLoggerName(logger.getName());
184      if (SHOW_SOURCE) {
185         StackTraceElement[] stack = new Throwable().getStackTrace();
186         for (StackTraceElement e : stack) {
187            if (!e.getClassName().equals(getClass().getName())) {
188               r.setSourceClassName(e.getClassName());
189               r.setSourceMethodName(e.getMethodName());
190               break;
191            }
192         }
193      }
194      logger.log(r);
195   }
196
197   private boolean isLoggable(Level level) {
198      return logger.isLoggable(level);
199   }
200
201   @Override
202   public boolean isTraceEnabled() {
203      // TODO Auto-generated method stub
204      return false;
205   }
206
207   @Override
208   public void trace(String msg) {
209      // TODO Auto-generated method stub
210
211   }
212
213   @Override
214   public void trace(String format, Object arg) {
215      // TODO Auto-generated method stub
216
217   }
218
219   @Override
220   public void trace(String format, Object arg1, Object arg2) {
221      // TODO Auto-generated method stub
222
223   }
224
225   @Override
226   public void trace(String format, Object... arguments) {
227      // TODO Auto-generated method stub
228
229   }
230
231   @Override
232   public void trace(String msg, Throwable t) {
233      // TODO Auto-generated method stub
234
235   }
236
237   @Override
238   public boolean isTraceEnabled(Marker marker) {
239      // TODO Auto-generated method stub
240      return false;
241   }
242
243   @Override
244   public void trace(Marker marker, String msg) {
245      // TODO Auto-generated method stub
246
247   }
248
249   @Override
250   public void trace(Marker marker, String format, Object arg) {
251      // TODO Auto-generated method stub
252
253   }
254
255   @Override
256   public void trace(Marker marker, String format, Object arg1, Object arg2) {
257      // TODO Auto-generated method stub
258
259   }
260
261   @Override
262   public void trace(Marker marker, String format, Object... argArray) {
263      // TODO Auto-generated method stub
264
265   }
266
267   @Override
268   public void trace(Marker marker, String msg, Throwable t) {
269      // TODO Auto-generated method stub
270
271   }
272
273   @Override
274   public void debug(String msg) {
275      // TODO Auto-generated method stub
276
277   }
278
279   @Override
280   public void debug(String format, Object arg) {
281      // TODO Auto-generated method stub
282
283   }
284
285   @Override
286   public void debug(String format, Object arg1, Object arg2) {
287      // TODO Auto-generated method stub
288
289   }
290
291   @Override
292   public boolean isDebugEnabled(Marker marker) {
293      // TODO Auto-generated method stub
294      return false;
295   }
296
297   @Override
298   public void debug(Marker marker, String msg) {
299      // TODO Auto-generated method stub
300
301   }
302
303   @Override
304   public void debug(Marker marker, String format, Object arg) {
305      // TODO Auto-generated method stub
306
307   }
308
309   @Override
310   public void debug(Marker marker, String format, Object arg1, Object arg2) {
311      // TODO Auto-generated method stub
312
313   }
314
315   @Override
316   public void debug(Marker marker, String format, Object... arguments) {
317      // TODO Auto-generated method stub
318
319   }
320
321   @Override
322   public void debug(Marker marker, String msg, Throwable t) {
323      // TODO Auto-generated method stub
324
325   }
326
327   @Override
328   public boolean isInfoEnabled() {
329      // TODO Auto-generated method stub
330      return false;
331   }
332
333   @Override
334   public void info(String msg) {
335      // TODO Auto-generated method stub
336   }
337
338   @Override
339   public void info(String format, Object arg) {
340      // TODO Auto-generated method stub
341   }
342
343   @Override
344   public void info(String format, Object arg1, Object arg2) {
345      // TODO Auto-generated method stub
346   }
347
348   @Override
349   public boolean isInfoEnabled(Marker marker) {
350      // TODO Auto-generated method stub
351      return false;
352   }
353
354   @Override
355   public void info(Marker marker, String msg) {
356      // TODO Auto-generated method stub
357   }
358
359   @Override
360   public void info(Marker marker, String format, Object arg) {
361      // TODO Auto-generated method stub
362
363   }
364
365   @Override
366   public void info(Marker marker, String format, Object arg1, Object arg2) {
367      // TODO Auto-generated method stub
368   }
369
370   @Override
371   public void info(Marker marker, String format, Object... arguments) {
372      // TODO Auto-generated method stub
373   }
374
375   @Override
376   public void info(Marker marker, String msg, Throwable t) {
377      // TODO Auto-generated method stub
378
379   }
380
381   @Override
382   public boolean isWarnEnabled() {
383      // TODO Auto-generated method stub
384      return false;
385   }
386
387   @Override
388   public void warn(String msg) {
389      // TODO Auto-generated method stub
390   }
391
392   @Override
393   public void warn(String format, Object arg) {
394      // TODO Auto-generated method stub
395   }
396
397   @Override
398   public void warn(String format, Object arg1, Object arg2) {
399      // TODO Auto-generated method stub
400
401   }
402
403   @Override
404   public boolean isWarnEnabled(Marker marker) {
405      // TODO Auto-generated method stub
406      return false;
407   }
408
409   @Override
410   public void warn(Marker marker, String msg) {
411      // TODO Auto-generated method stub
412   }
413
414   @Override
415   public void warn(Marker marker, String format, Object arg) {
416      // TODO Auto-generated method stub
417   }
418
419   @Override
420   public void warn(Marker marker, String format, Object arg1, Object arg2) {
421      // TODO Auto-generated method stub
422   }
423
424   @Override
425   public void warn(Marker marker, String format, Object... arguments) {
426      // TODO Auto-generated method stub
427   }
428
429   @Override
430   public void warn(Marker marker, String msg, Throwable t) {
431      // TODO Auto-generated method stub
432   }
433
434   @Override
435   public boolean isErrorEnabled() {
436      // TODO Auto-generated method stub
437      return false;
438   }
439
440   @Override
441   public void error(String msg) {
442      // TODO Auto-generated method stub
443   }
444
445   @Override
446   public void error(String format, Object arg) {
447      // TODO Auto-generated method stub
448   }
449
450   @Override
451   public void error(String format, Object arg1, Object arg2) {
452      // TODO Auto-generated method stub
453   }
454
455   @Override
456   public void error(String format, Object... arguments) {
457      // TODO Auto-generated method stub
458   }
459
460   @Override
461   public void error(String msg, Throwable t) {
462      // TODO Auto-generated method stub
463   }
464
465   @Override
466   public boolean isErrorEnabled(Marker marker) {
467      // TODO Auto-generated method stub
468      return false;
469   }
470
471   @Override
472   public void error(Marker marker, String msg) {
473      // TODO Auto-generated method stub
474   }
475
476   @Override
477   public void error(Marker marker, String format, Object arg) {
478      // TODO Auto-generated method stub
479   }
480
481   @Override
482   public void error(Marker marker, String format, Object arg1, Object arg2) {
483      // TODO Auto-generated method stub
484   }
485
486   @Override
487   public void error(Marker marker, String format, Object... arguments) {
488      // TODO Auto-generated method stub
489   }
490
491   @Override
492   public void error(Marker marker, String msg, Throwable t) {
493      // TODO Auto-generated method stub
494   }
495
496   @Override
497   public void log(Marker marker, String fqcn, int level, String message, Object[] argArray, Throwable t) {
498      // TODO Auto-generated method stub
499   }
500}