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.tomcat;
018
019import static java.util.logging.Level.*;
020import static org.apache.juneau.commons.utils.Shorts.*;
021
022import java.util.logging.*;
023
024import org.apache.juli.logging.*;
025
026/**
027 * Implementation of the embedded-Tomcat {@link Log} façade based on {@link Logger}.
028 *
029 * <p>
030 * Allows Tomcat to log to the Java Util logging framework (and thus to the main log file defined in the
031 * <cc>[Logging]</cc> section), mirroring the role of
032 * {@code org.apache.juneau.marshall.microservice.jetty.JettyLogger} in the Jetty module.
033 *
034 * <p>
035 * Tomcat log levels map to {@link Level} values as follows: <c>trace</c>&rarr;{@link Level#FINEST FINEST},
036 * <c>debug</c>&rarr;{@link Level#FINE FINE}, <c>info</c>&rarr;{@link Level#INFO INFO},
037 * <c>warn</c>&rarr;{@link Level#WARNING WARNING}, and <c>error</c>/<c>fatal</c>&rarr;{@link Level#SEVERE SEVERE}.
038 *
039 * <h5 class='section'>See Also:</h5><ul>
040 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauMicroserviceTomcat">juneau-microservice-tomcat</a>
041 * </ul>
042 *
043 * @since 10.0.0
044 */
045public class TomcatLogger implements Log {
046
047   private final Logger logger;
048
049   /**
050    * Default constructor.
051    *
052    * <p>
053    * Returns the logger with name <js>"org.apache.juneau.marshall.microservice.tomcat"</js>.
054    */
055   public TomcatLogger() {
056      this("org.apache.juneau.marshall.microservice.tomcat");
057   }
058
059   /**
060    * Normal constructor.
061    *
062    * @param name The logger name.  Must not be <jk>null</jk>.
063    */
064   public TomcatLogger(String name) {
065      logger = Logger.getLogger(name);
066   }
067
068   /**
069    * Returns the name of the underlying Java Util logger.
070    *
071    * @return The logger name.
072    */
073   public String getName() {
074      return logger.getName();
075   }
076
077   @Override /* Overridden from Log */
078   public boolean isTraceEnabled() {
079      return logger.isLoggable(FINEST);
080   }
081
082   @Override /* Overridden from Log */
083   public boolean isDebugEnabled() {
084      return logger.isLoggable(FINE);
085   }
086
087   @Override /* Overridden from Log */
088   public boolean isInfoEnabled() {
089      return logger.isLoggable(INFO);
090   }
091
092   @Override /* Overridden from Log */
093   public boolean isWarnEnabled() {
094      return logger.isLoggable(WARNING);
095   }
096
097   @Override /* Overridden from Log */
098   public boolean isErrorEnabled() {
099      return logger.isLoggable(SEVERE);
100   }
101
102   @Override /* Overridden from Log */
103   public boolean isFatalEnabled() {
104      return logger.isLoggable(SEVERE);
105   }
106
107   @Override /* Overridden from Log */
108   public void trace(Object message) {
109      log(FINEST, message, null);
110   }
111
112   @Override /* Overridden from Log */
113   public void trace(Object message, Throwable t) {
114      log(FINEST, message, t);
115   }
116
117   @Override /* Overridden from Log */
118   public void debug(Object message) {
119      log(FINE, message, null);
120   }
121
122   @Override /* Overridden from Log */
123   public void debug(Object message, Throwable t) {
124      log(FINE, message, t);
125   }
126
127   @Override /* Overridden from Log */
128   public void info(Object message) {
129      log(INFO, message, null);
130   }
131
132   @Override /* Overridden from Log */
133   public void info(Object message, Throwable t) {
134      log(INFO, message, t);
135   }
136
137   @Override /* Overridden from Log */
138   public void warn(Object message) {
139      log(WARNING, message, null);
140   }
141
142   @Override /* Overridden from Log */
143   public void warn(Object message, Throwable t) {
144      log(WARNING, message, t);
145   }
146
147   @Override /* Overridden from Log */
148   public void error(Object message) {
149      log(SEVERE, message, null);
150   }
151
152   @Override /* Overridden from Log */
153   public void error(Object message, Throwable t) {
154      log(SEVERE, message, t);
155   }
156
157   @Override /* Overridden from Log */
158   public void fatal(Object message) {
159      log(SEVERE, message, null);
160   }
161
162   @Override /* Overridden from Log */
163   public void fatal(Object message, Throwable t) {
164      log(SEVERE, message, t);
165   }
166
167   /**
168    * Internal log method that creates a {@link LogRecord} and logs it through the underlying Java Util logger.
169    *
170    * @param level The log level.
171    * @param message The log message (its {@code toString()} is used; {@code null} is rendered as an empty string).
172    * @param thrown The throwable to log, or <jk>null</jk> if none.
173    */
174   private void log(Level level, Object message, Throwable thrown) {
175      if (! logger.isLoggable(level))
176         return;
177      var r = new LogRecord(level, message == null ? "" : message.toString());
178      if (nn(thrown))
179         r.setThrown(thrown);
180      r.setLoggerName(logger.getName());
181      logger.log(r);
182   }
183}