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 */
017
018package org.apache.logging.log4j.jul;
019
020import java.util.logging.Filter;
021import java.util.logging.Level;
022import java.util.logging.LogRecord;
023import java.util.logging.Logger;
024
025import org.apache.logging.log4j.message.Message;
026import org.apache.logging.log4j.spi.ExtendedLogger;
027
028/**
029 * Log4j API implementation of the JUL {@link Logger} class. <strong>Note that this implementation does
030 * <em>not</em> use the {@link java.util.logging.Handler} class.</strong> Instead, logging is delegated to the
031 * underlying Log4j {@link org.apache.logging.log4j.Logger} which may be implemented in one of many different ways.
032 * Consult the documentation for your Log4j Provider for more details.
033 * <p>Note that the methods {@link #getParent()} and {@link #setLevel(java.util.logging.Level)} are not supported by
034 * this implementation. If you need support for these methods, then you'll need to use log4j-core. The
035 * {@link #getParent()} method will not fail (thanks to JUL API limitations), but it won't necessarily be
036 * accurate!</p>
037 * <p>Also note that {@link #setParent(java.util.logging.Logger)} is explicitly unsupported. Parent loggers are
038 * determined using the syntax of the logger name; not through an arbitrary graph of loggers.</p>
039 * 
040 * @since 2.1
041 */
042public class ApiLogger extends Logger {
043
044    private final WrappedLogger logger;
045    private static final String FQCN = ApiLogger.class.getName();
046
047    ApiLogger(final ExtendedLogger logger) {
048        super(logger.getName(), null);
049        super.setLevel(LevelTranslator.toJavaLevel(logger.getLevel()));
050        this.logger = new WrappedLogger(logger);
051    }
052
053    @Override
054    public void log(final LogRecord record) {
055        if (isFiltered(record)) {
056            return;
057        }
058        final org.apache.logging.log4j.Level level = LevelTranslator.toLevel(record.getLevel());
059        final Message message = logger.getMessageFactory().newMessage(record.getMessage(), record.getParameters());
060        final Throwable thrown = record.getThrown();
061        logger.logIfEnabled(FQCN, level, null, message, thrown);
062    }
063
064    // support for Logger.getFilter()/Logger.setFilter()
065    boolean isFiltered(final LogRecord logRecord) {
066        final Filter filter = getFilter();
067        return filter != null && !filter.isLoggable(logRecord);
068    }
069
070    @Override
071    public boolean isLoggable(final Level level) {
072        return logger.isEnabled(LevelTranslator.toLevel(level));
073    }
074
075    @Override
076    public String getName() {
077        return logger.getName();
078    }
079
080    @Override
081    public void setLevel(final Level newLevel) throws SecurityException {
082        throw new UnsupportedOperationException("Cannot set level through log4j-api");
083    }
084
085    /**
086     * Provides access to {@link Logger#setLevel(java.util.logging.Level)}. This method should only be used by child
087     * classes.
088     *
089     * @see Logger#setLevel(java.util.logging.Level)
090     */
091    protected void doSetLevel(final Level newLevel) throws SecurityException {
092        super.setLevel(newLevel);
093    }
094
095    /**
096     * Unsupported operation.
097     * @throws UnsupportedOperationException always
098     */
099    @Override
100    public void setParent(final Logger parent) {
101        throw new UnsupportedOperationException("Cannot set parent logger");
102    }
103
104    @Override
105    public void log(final Level level, final String msg) {
106        logger.log(LevelTranslator.toLevel(level), msg);
107    }
108
109    @Override
110    public void log(final Level level, final String msg, final Object param1) {
111        logger.log(LevelTranslator.toLevel(level), msg, param1);
112    }
113
114    @Override
115    public void log(final Level level, final String msg, final Object[] params) {
116        logger.log(LevelTranslator.toLevel(level), msg, params);
117    }
118
119    @Override
120    public void log(final Level level, final String msg, final Throwable thrown) {
121        logger.log(LevelTranslator.toLevel(level), msg, thrown);
122    }
123
124    @Override
125    public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg) {
126        log(level, msg);
127    }
128
129    @Override
130    public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg,
131                     final Object param1) {
132        log(level, msg, param1);
133    }
134
135    @Override
136    public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg,
137                     final Object[] params) {
138        log(level, msg, params);
139    }
140
141    @Override
142    public void logp(final Level level, final String sourceClass, final String sourceMethod, final String msg,
143                     final Throwable thrown) {
144        log(level, msg, thrown);
145    }
146
147    @Override
148    public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName,
149                      final String msg) {
150        log(level, msg);
151    }
152
153    @Override
154    public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName,
155                      final String msg, final Object param1) {
156        log(level, msg, param1);
157    }
158
159    @Override
160    public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName,
161                      final String msg, final Object[] params) {
162        log(level, msg, params);
163    }
164
165    @Override
166    public void logrb(final Level level, final String sourceClass, final String sourceMethod, final String bundleName,
167                      final String msg, final Throwable thrown) {
168        log(level, msg, thrown);
169    }
170
171    @Override
172    public void entering(final String sourceClass, final String sourceMethod) {
173        logger.entry();
174    }
175
176    @Override
177    public void entering(final String sourceClass, final String sourceMethod, final Object param1) {
178        logger.entry(param1);
179    }
180
181    @Override
182    public void entering(final String sourceClass, final String sourceMethod, final Object[] params) {
183        logger.entry(params);
184    }
185
186    @Override
187    public void exiting(final String sourceClass, final String sourceMethod) {
188        logger.exit();
189    }
190
191    @Override
192    public void exiting(final String sourceClass, final String sourceMethod, final Object result) {
193        logger.exit(result);
194    }
195
196    @Override
197    public void throwing(final String sourceClass, final String sourceMethod, final Throwable thrown) {
198        logger.throwing(thrown);
199    }
200
201    @Override
202    public void severe(final String msg) {
203        logger.logIfEnabled(FQCN, org.apache.logging.log4j.Level.ERROR, null, msg);
204    }
205
206    @Override
207    public void warning(final String msg) {
208        logger.logIfEnabled(FQCN, org.apache.logging.log4j.Level.WARN, null, msg);
209    }
210
211    @Override
212    public void info(final String msg) {
213        logger.logIfEnabled(FQCN, org.apache.logging.log4j.Level.INFO, null, msg);
214    }
215
216    @Override
217    public void config(final String msg) {
218        logger.logIfEnabled(FQCN, LevelTranslator.CONFIG, null, msg);
219    }
220
221    @Override
222    public void fine(final String msg) {
223        logger.logIfEnabled(FQCN, org.apache.logging.log4j.Level.DEBUG, null, msg);
224    }
225
226    @Override
227    public void finer(final String msg) {
228        logger.logIfEnabled(FQCN, org.apache.logging.log4j.Level.TRACE, null, msg);
229    }
230
231    @Override
232    public void finest(final String msg) {
233        logger.logIfEnabled(FQCN, LevelTranslator.FINEST, null, msg);
234    }
235}