    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 *      https://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 */
    017
    018package org.apache.commons.logging.impl;
    019
    020import java.io.Serializable;
    021import java.util.logging.Level;
    022import java.util.logging.Logger;
    023
    024import org.apache.commons.logging.Log;
    025
    026/**
    027 * Implements the {@code org.apache.commons.logging.Log}
    028 * interface to wrap the standard JDK logging mechanisms that were
    029 * introduced in the Merlin release (JDK 1.4).
    030 */
    031public class Jdk14Logger implements Log, Serializable {
    032
    033    /** Serializable version identifier. */
    034    private static final long serialVersionUID = 4784713551416303804L;
    035
    036    /**
    037     * This member variable simply ensures that any attempt to initialize
    038     * this class in a pre-1.4 JVM will result in an ExceptionInInitializerError.
    039     * It must not be private, as an optimizing compiler could detect that it
    040     * is not used and optimize it away.
    041     */
    042    protected static final Level dummyLevel = Level.FINE;
    043
    044    /**
    045     * The underlying Logger implementation we are using.
    046     */
    047    protected transient Logger logger;
    048
    049    /**
    050     * The name of the logger we are wrapping.
    051     */
    052    protected String name;
    053
    054    /**
    055     * Constructs a named instance of this Logger.
    056     *
    057     * @param name Name of the logger to be constructed
    058     */
    059    public Jdk14Logger(final String name) {
    060        this.name = name;
    061        logger = getLogger();
    062    }
    063
    064    /**
    065     * Logs a message with {@link java.util.logging.Level#FINE}.
    066     *
    067     * @param message to log
    068     * @see org.apache.commons.logging.Log#debug(Object)
    069     */
    070    @Override
    071    public void debug(final Object message) {
    072        log(Level.FINE, String.valueOf(message), null);
    073    }
    074
    075    /**
    076     * Logs a message with {@link java.util.logging.Level#FINE}.
    077     *
    078     * @param message to log
    079     * @param exception log this cause
    080     * @see org.apache.commons.logging.Log#debug(Object, Throwable)
    081     */
    082    @Override
    083    public void debug(final Object message, final Throwable exception) {
    084        log(Level.FINE, String.valueOf(message), exception);
    085    }
    086
    087    /**
    088     * Logs a message with {@link java.util.logging.Level#SEVERE}.
    089     *
    090     * @param message to log
    091     * @see org.apache.commons.logging.Log#error(Object)
    092     */
    093    @Override
    094    public void error(final Object message) {
    095        log(Level.SEVERE, String.valueOf(message), null);
    096    }
    097
    098    /**
    099     * Logs a message with {@link java.util.logging.Level#SEVERE}.
    100     *
    101     * @param message to log
    102     * @param exception log this cause
    103     * @see org.apache.commons.logging.Log#error(Object, Throwable)
    104     */
    105    @Override
    106    public void error(final Object message, final Throwable exception) {
    107        log(Level.SEVERE, String.valueOf(message), exception);
    108    }
    109
    110    /**
    111     * Logs a message with {@link java.util.logging.Level#SEVERE}.
    112     *
    113     * @param message to log
    114     * @see org.apache.commons.logging.Log#fatal(Object)
    115     */
    116    @Override
    117    public void fatal(final Object message) {
    118        log(Level.SEVERE, String.valueOf(message), null);
    119    }
    120
    121    /**
    122     * Logs a message with {@link java.util.logging.Level#SEVERE}.
    123     *
    124     * @param message to log
    125     * @param exception log this cause
    126     * @see org.apache.commons.logging.Log#fatal(Object, Throwable)
    127     */
    128    @Override
    129    public void fatal(final Object message, final Throwable exception) {
    130        log(Level.SEVERE, String.valueOf(message), exception);
    131    }
    132
    133    /**
    134     * Gets the native Logger instance we are using.
    135     *
    136     * @return  the native Logger instance we are using.
    137     */
    138    public Logger getLogger() {
    139        if (logger == null) {
    140            logger = Logger.getLogger(name);
    141        }
    142        return logger;
    143    }
    144
    145    /**
    146     * Logs a message with {@link java.util.logging.Level#INFO}.
    147     *
    148     * @param message to log
    149     * @see org.apache.commons.logging.Log#info(Object)
    150     */
    151    @Override
    152    public void info(final Object message) {
    153        log(Level.INFO, String.valueOf(message), null);
    154    }
    155
    156    /**
    157     * Logs a message with {@link java.util.logging.Level#INFO}.
    158     *
    159     * @param message to log
    160     * @param exception log this cause
    161     * @see org.apache.commons.logging.Log#info(Object, Throwable)
    162     */
    163    @Override
    164    public void info(final Object message, final Throwable exception) {
    165        log(Level.INFO, String.valueOf(message), exception);
    166    }
    167
    168    /**
    169     * Is debug logging currently enabled?
    170     */
    171    @Override
    172    public boolean isDebugEnabled() {
    173        return getLogger().isLoggable(Level.FINE);
    174    }
    175
    176    /**
    177     * Is error logging currently enabled?
    178     */
    179    @Override
    180    public boolean isErrorEnabled() {
    181        return getLogger().isLoggable(Level.SEVERE);
    182    }
    183
    184    /**
    185     * Is fatal logging currently enabled?
    186     */
    187    @Override
    188    public boolean isFatalEnabled() {
    189        return getLogger().isLoggable(Level.SEVERE);
    190    }
    191
    192    /**
    193     * Is info logging currently enabled?
    194     */
    195    @Override
    196    public boolean isInfoEnabled() {
    197        return getLogger().isLoggable(Level.INFO);
    198    }
    199
    200    /**
    201     * Is trace logging currently enabled?
    202     */
    203    @Override
    204    public boolean isTraceEnabled() {
    205        return getLogger().isLoggable(Level.FINEST);
    206    }
    207
    208    /**
    209     * Is warn logging currently enabled?
    210     */
    211    @Override
    212    public boolean isWarnEnabled() {
    213        return getLogger().isLoggable(Level.WARNING);
    214    }
    215
    216    /**
    217     * Logs a message at the given level.
    218     *
    219     * @param level The level.
    220     * @param msg The message.
    221     * @param ex The exception.
    222     */
    223    protected void log(final Level level, final String msg, final Throwable ex) {
    224        final Logger logger = getLogger();
    225        if (logger.isLoggable(level)) {
    226            // Hack (?) to get the stack trace.
    227            final Throwable dummyException = new Throwable();
    228            final StackTraceElement[] locations = dummyException.getStackTrace();
    229            // LOGGING-132: use the provided logger name instead of the class name
    230            final String cname = name;
    231            String method = "unknown";
    232            // Caller will be the third element
    233            if (locations != null && locations.length > 2) {
    234                final StackTraceElement caller = locations[2];
    235                method = caller.getMethodName();
    236            }
    237            if (ex == null) {
    238                logger.logp(level, cname, method, msg);
    239            } else {
    240                logger.logp(level, cname, method, msg, ex);
    241            }
    242        }
    243    }
    244
    245    /**
    246     * Logs a message with {@link java.util.logging.Level#FINEST}.
    247     *
    248     * @param message to log
    249     * @see org.apache.commons.logging.Log#trace(Object)
    250     */
    251    @Override
    252    public void trace(final Object message) {
    253        log(Level.FINEST, String.valueOf(message), null);
    254    }
    255
    256    /**
    257     * Logs a message with {@link java.util.logging.Level#FINEST}.
    258     *
    259     * @param message to log
    260     * @param exception log this cause
    261     * @see org.apache.commons.logging.Log#trace(Object, Throwable)
    262     */
    263    @Override
    264    public void trace(final Object message, final Throwable exception) {
    265        log(Level.FINEST, String.valueOf(message), exception);
    266    }
    267
    268    /**
    269     * Logs a message with {@link java.util.logging.Level#WARNING}.
    270     *
    271     * @param message to log
    272     * @see org.apache.commons.logging.Log#warn(Object)
    273     */
    274    @Override
    275    public void warn(final Object message) {
    276        log(Level.WARNING, String.valueOf(message), null);
    277    }
    278
    279    /**
    280     * Logs a message with {@link java.util.logging.Level#WARNING}.
    281     *
    282     * @param message to log
    283     * @param exception log this cause
    284     * @see org.apache.commons.logging.Log#warn(Object, Throwable)
    285     */
    286    @Override
    287    public void warn(final Object message, final Throwable exception) {
    288        log(Level.WARNING, String.valueOf(message), exception);
    289    }
    290}