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.logging.log4j;
018
019import org.apache.logging.log4j.message.Message;
020import org.apache.logging.log4j.message.MessageFactory;
021
022/**
023 * This is the central interface in the log4j package. Most logging operations, except configuration, are done through
024 * this interface.
025 *
026 * <p>
027 * The canonical way to obtain a Logger for a class is through {@link LogManager#getLogger()}. Typically, each class
028 * gets its own Logger named after its fully qualified class name (the default Logger name when obtained through the
029 * {@link LogManager#getLogger()} method). Thus, the simplest way to use this would be like so:
030 * </p>
031 * 
032 * <pre>
033 * public class MyClass {
034 *     private static final Logger LOGGER = LogManager.getLogger();
035 *     // ...
036 * }
037 * </pre>
038 * <p>
039 * For ease of filtering, searching, sorting, etc., it is generally a good idea to create Loggers for each class rather
040 * than sharing Loggers. Instead, {@link Marker Markers} should be used for shared, filterable identification.
041 * </p>
042 * <p>
043 * For service provider implementations, it is recommended to extend the
044 * {@link org.apache.logging.log4j.spi.AbstractLogger} class rather than implementing this interface directly.
045 * </p>
046 */
047public interface LevelLogger {
048
049    /**
050     * Logs an exception or error that has been caught. Normally, one may wish to provide additional information with an
051     * exception while logging it; in these cases, one would not use this method. In other cases where simply logging
052     * the fact that an exception was swallowed somewhere (e.g., at the top of the stack trace in a {@code main()}
053     * method), this method is ideal for it.
054     *
055     * @param t
056     *        The Throwable.
057     */
058    void catching(Throwable t);
059
060    /**
061     * Logs entry to a method. Used when the method in question has no parameters or when the parameters should not be
062     * logged.
063     */
064    void entry();
065
066    /**
067     * Logs entry to a method along with its parameters. For example,
068     * 
069     * <pre>
070     * public void doSomething(String foo, int bar) {
071     *     LOGGER.entry(foo, bar);
072     *     // do something
073     * }
074     * </pre>
075     * <p>
076     * The use of methods such as this are more effective when combined with aspect-oriented programming or other
077     * bytecode manipulation tools. It can be rather tedious (and messy) to use this type of method manually.
078     * </p>
079     *
080     * @param params
081     *        The parameters to the method. TODO Use of varargs results in array creation which can be a substantial
082     *        portion of no-op case. LogMF/LogSF provides several overrides to avoid vararg except in edge cases. (RG)
083     *        LogMF and LogSF implement these in LogXF which calls logger.callAppenders. callAppenders is part of the
084     *        implementation and cannot be used by the API. Adding more methods here and in AbstractLogger is
085     *        sufficient.
086     */
087    void entry(Object... params);
088
089    /**
090     * Logs exit from a method. Used for methods that do not return anything.
091     */
092    void exit();
093
094    /**
095     * Logs exiting from a method with the result. This may be coded as:
096     * 
097     * <pre>
098     * return LOGGER.exit(myResult);
099     * </pre>
100     *
101     * @param <R>
102     *        The type of the parameter and object being returned.
103     * @param result
104     *        The result being returned from the method call.
105     * @return the result.
106     */
107    <R> R exit(R result);
108
109    /**
110     * Gets the Level associated with the Logger.
111     *
112     * @return the Level associate with the Logger.
113     */
114    Level getLevel();
115
116    /**
117     * Gets the message factory used to convert message Objects and Strings into actual log Messages.
118     *
119     * @return the message factory.
120     */
121    MessageFactory getMessageFactory();
122
123    /**
124     * Gets the logger name.
125     *
126     * @return the logger name.
127     */
128    String getName();
129
130    /**
131     * Checks whether this Logger is enabled for the {@link Level#DEBUG DEBUG} Level.
132     *
133     * @return boolean - {@code true} if this Logger is enabled for level DEBUG, {@code false} otherwise.
134     */
135    boolean isDebugEnabled();
136
137    /**
138     * Checks whether this Logger is enabled for the {@link Level#DEBUG DEBUG} Level.
139     *
140     * @param marker
141     *        The marker data specific to this log statement.
142     * @return boolean - {@code true} if this Logger is enabled for level DEBUG, {@code false} otherwise.
143     */
144    boolean isDebugEnabled(Marker marker);
145
146    /**
147     * Checks whether this Logger is enabled for the the given Level.
148     * <p>
149     * Note that passing in {@link Level#OFF OFF} always returns {@code true}.
150     * </p>
151     *
152     * @return boolean - {@code true} if this Logger is enabled for level, {@code false} otherwise.
153     */
154    boolean isEnabled(Level level);
155
156    /**
157     * Checks whether this logger is enabled at the specified level and an optional Marker.
158     *
159     * @param marker
160     *        The marker data specific to this log statement.
161     * @return boolean - {@code true} if this Logger is enabled for level {@link Level#WARN WARN}, {@code false}
162     *         otherwise.
163     */
164    boolean isEnabled(Marker marker);
165
166    /**
167     * Checks whether this Logger is enabled for the {@link Level#ERROR ERROR} Level.
168     *
169     * @return boolean - {@code true} if this Logger is enabled for level {@link Level#ERROR ERROR}, {@code false}
170     *         otherwise.
171     */
172    boolean isErrorEnabled();
173
174    /**
175     * Checks whether this Logger is enabled for the {@link Level#ERROR ERROR} Level.
176     *
177     * @param marker
178     *        The marker data specific to this log statement.
179     * @return boolean - {@code true} if this Logger is enabled for level {@link Level#ERROR ERROR}, {@code false}
180     *         otherwise.
181     */
182    boolean isErrorEnabled(Marker marker);
183
184    /**
185     * Checks whether this Logger is enabled for the {@link Level#FATAL FATAL} Level.
186     *
187     * @return boolean - {@code true} if this Logger is enabled for level {@link Level#FATAL FATAL}, {@code false}
188     *         otherwise.
189     */
190    boolean isFatalEnabled();
191
192    /**
193     * Checks whether this Logger is enabled for the {@link Level#FATAL FATAL} Level.
194     *
195     * @param marker
196     *        The marker data specific to this log statement.
197     * @return boolean - {@code true} if this Logger is enabled for level {@link Level#FATAL FATAL}, {@code false}
198     *         otherwise.
199     */
200    boolean isFatalEnabled(Marker marker);
201
202    /**
203     * Checks whether this Logger is enabled for the {@link Level#INFO INFO} Level.
204     *
205     * @return boolean - {@code true} if this Logger is enabled for level INFO, {@code false} otherwise.
206     */
207    boolean isInfoEnabled();
208
209    /**
210     * Checks whether this Logger is enabled for the {@link Level#INFO INFO} Level.
211     *
212     * @param marker
213     *        The marker data specific to this log statement.
214     * @return boolean - {@code true} if this Logger is enabled for level INFO, {@code false} otherwise.
215     */
216    boolean isInfoEnabled(Marker marker);
217
218    /**
219     * Checks whether this Logger is enabled for the {@link Level#TRACE TRACE} level.
220     *
221     * @return boolean - {@code true} if this Logger is enabled for level TRACE, {@code false} otherwise.
222     */
223    boolean isTraceEnabled();
224
225    /**
226     * Checks whether this Logger is enabled for the {@link Level#TRACE TRACE} level.
227     *
228     * @param marker
229     *        The marker data specific to this log statement.
230     * @return boolean - {@code true} if this Logger is enabled for level TRACE, {@code false} otherwise.
231     */
232    boolean isTraceEnabled(Marker marker);
233
234    /**
235     * Checks whether this Logger is enabled for the {@link Level#WARN WARN} Level.
236     *
237     * @return boolean - {@code true} if this Logger is enabled for level {@link Level#WARN WARN}, {@code false}
238     *         otherwise.
239     */
240    boolean isWarnEnabled();
241
242    /**
243     * Checks whether this Logger is enabled for the {@link Level#WARN WARN} Level.
244     *
245     * @param marker
246     *        The marker data specific to this log statement.
247     * @return boolean - {@code true} if this Logger is enabled for level {@link Level#WARN WARN}, {@code false}
248     *         otherwise.
249     */
250    boolean isWarnEnabled(Marker marker);
251
252    /**
253     * Logs a message with the specific Marker at the given level.
254     *
255     * 
256     * @param marker
257     *        the marker data specific to this log statement
258     * @param msg
259     *        the message string to be logged
260     */
261    void log(Marker marker, Message msg);
262
263    /**
264     * Logs a message with the specific Marker at the given level.
265     *
266     * @param marker
267     *        the marker data specific to this log statement
268     * @param msg
269     *        the message string to be logged
270     * @param t
271     *        A Throwable or null.
272     */
273    void log(Marker marker, Message msg, Throwable t);
274
275    /**
276     * Logs a message object with the given level.
277     *
278     * @param marker
279     *        the marker data specific to this log statement
280     * @param message
281     *        the message object to log.
282     */
283    void log(Marker marker, Object message);
284
285    /**
286     * Logs a message at the given level including the stack trace of the {@link Throwable} <code>t</code> passed as
287     * parameter.
288     *
289     * @param marker
290     *        the marker data specific to this log statement
291     * @param message
292     *        the message to log.
293     * @param t
294     *        the exception to log, including its stack trace.
295     */
296    void log(Marker marker, Object message, Throwable t);
297
298    /**
299     * Logs a message object with the given level.
300     *
301     * 
302     * @param marker
303     *        the marker data specific to this log statement
304     * @param message
305     *        the message object to log.
306     */
307    void log(Marker marker, String message);
308
309    /**
310     * Logs a message with parameters at the given level.
311     *
312     * @param marker
313     *        the marker data specific to this log statement
314     * @param message
315     *        the message to log; the format depends on the message factory.
316     * @param params
317     *        parameters to the message.
318     * @see #getMessageFactory()
319     */
320    void log(Marker marker, String message, Object... params);
321
322    /**
323     * Logs a message at the given level including the stack trace of the {@link Throwable} <code>t</code> passed as
324     * parameter.
325     *
326     * @param marker
327     *        the marker data specific to this log statement
328     * @param message
329     *        the message to log.
330     * @param t
331     *        the exception to log, including its stack trace.
332     */
333    void log(Marker marker, String message, Throwable t);
334
335    /**
336     * Logs a message with the specific Marker at the given level.
337     *
338     * @param msg
339     *        the message string to be logged
340     */
341    void log(Message msg);
342
343    /**
344     * Logs a message with the specific Marker at the given level.
345     *
346     * @param msg
347     *        the message string to be logged
348     * @param t
349     *        A Throwable or null.
350     */
351    void log(Message msg, Throwable t);
352
353    /**
354     * Logs a message object with the given level.
355     *
356     * @param message
357     *        the message object to log.
358     */
359    void log(Object message);
360
361    /**
362     * Logs a message at the given level including the stack trace of the {@link Throwable} <code>t</code> passed as
363     * parameter.
364     *
365     * @param message
366     *        the message to log.
367     * @param t
368     *        the exception to log, including its stack trace.
369     */
370    void log(Object message, Throwable t);
371
372    /**
373     * Logs a message object with the given level.
374     *
375     * @param message
376     *        the message string to log.
377     */
378    void log(String message);
379
380    /**
381     * Logs a message with parameters at the given level.
382     *
383     * 
384     * @param message
385     *        the message to log; the format depends on the message factory.
386     * @param params
387     *        parameters to the message.
388     * @see #getMessageFactory()
389     */
390    void log(String message, Object... params);
391
392    /**
393     * Logs a message at the given level including the stack trace of the {@link Throwable} <code>t</code> passed as
394     * parameter.
395     *
396     * 
397     * @param message
398     *        the message to log.
399     * @param t
400     *        the exception to log, including its stack trace.
401     */
402    void log(String message, Throwable t);
403
404    /**
405     * Logs a formatted message using the specified format string and arguments.
406     *
407     * 
408     * @param marker
409     *        the marker data specific to this log statement.
410     * @param format
411     *        The format String.
412     * @param params
413     *        Arguments specified by the format.
414     */
415    void printf(Marker marker, String format, Object... params);
416
417    /**
418     * Logs a formatted message using the specified format string and arguments.
419     *
420     * 
421     * @param format
422     *        The format String.
423     * @param params
424     *        Arguments specified by the format.
425     */
426    void printf(String format, Object... params);
427
428    /**
429     * Logs an exception or error to be thrown. This may be coded as:
430     * 
431     * <pre>
432     * throw logger.throwing(myException);
433     * </pre>
434     *
435     * @param <T>
436     *        the Throwable type.
437     * @param t
438     *        The Throwable.
439     * @return the Throwable.
440     */
441    <T extends Throwable> T throwing(T t);
442}