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}