[ https://issues.apache.org/jira/browse/LOG4J2-519?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13884294#comment-13884294 ]
Remko Popma edited comment on LOG4J2-519 at 1/30/14 12:55 AM: -------------------------------------------------------------- Attached a first attempt at a source code generator (Generate.java). Usage: Command to generate a wrapper that extends AbstractLoggerWrapper: {{java org.apache.logging.log4j.util.Generate$ExtendedLogger com.mycomp.ExtLogger DIAG=350 NOTICE=450 VERBOSE=550}} Command to generate a wrapper that only provides convenience methods for the specified custom levels (and hides the convenience methods for the built-in levels): {{java org.apache.logging.log4j.util.Generate$CustomLogger com.mycomp.MyLogger DEFCON1=350 DEFCON2=450 DEFCON3=550}} Example generated source: {code} package com.mycomp; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.MessageFactory; import org.apache.logging.log4j.spi.AbstractLogger; import org.apache.logging.log4j.spi.AbstractLoggerWrapper; /** * Extended Logger interface with convenience methods for * the DIAG, NOTICE and VERBOSE custom log levels. */ public final class ExtLogger extends AbstractLoggerWrapper { private static final long serialVersionUID = 216489351472874L; private static final Level DIAG = Level.forName("DIAG", 350); private static final Level NOTICE = Level.forName("NOTICE", 450); private static final Level VERBOSE = Level.forName("VERBOSE", 550); private ExtLogger(final Logger logger) { super((AbstractLogger) logger, logger.getName(), logger.getMessageFactory()); } /** * Returns a custom Logger with the name of the calling class. * * @return The custom Logger for the calling class. */ public static ExtLogger create() { final Logger wrapped = LogManager.getLogger(); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified name of the Class as * the Logger name. * * @param loggerName The Class whose name should be used as the Logger name. * If null it will default to the calling class. * @return The custom Logger. */ public static ExtLogger create(final Class<?> loggerName) { final Logger wrapped = LogManager.getLogger(loggerName); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified name of the Class as * the Logger name. * * @param loggerName The Class whose name should be used as the Logger name. * If null it will default to the calling class. * @param messageFactory The message factory is used only when creating a * logger, subsequent use does not change the logger but will log * a warning if mismatched. * @return The custom Logger. */ public static ExtLogger create(final Class<?> loggerName, final MessageFactory factory) { final Logger wrapped = LogManager.getLogger(loggerName, factory); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified class name of the value * as the Logger name. * * @param value The value whose class name should be used as the Logger * name. If null the name of the calling class will be used as * the logger name. * @return The custom Logger. */ public static ExtLogger create(final Object value) { final Logger wrapped = LogManager.getLogger(value); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified class name of the value * as the Logger name. * * @param value The value whose class name should be used as the Logger * name. If null the name of the calling class will be used as * the logger name. * @param messageFactory The message factory is used only when creating a * logger, subsequent use does not change the logger but will log * a warning if mismatched. * @return The custom Logger. */ public static ExtLogger create(final Object value, final MessageFactory factory) { final Logger wrapped = LogManager.getLogger(value, factory); return new ExtLogger(wrapped); } /** * Returns a custom Logger with the specified name. * * @param name The logger name. If null the name of the calling class will * be used. * @return The custom Logger. */ public static ExtLogger create(final String name) { final Logger wrapped = LogManager.getLogger(name); return new ExtLogger(wrapped); } /** * Returns a custom Logger with the specified name. * * @param name The logger name. If null the name of the calling class will * be used. * @param messageFactory The message factory is used only when creating a * logger, subsequent use does not change the logger but will log * a warning if mismatched. * @return The custom Logger. */ public static ExtLogger create(final String name, final MessageFactory factory) { final Logger wrapped = LogManager.getLogger(name, factory); return new ExtLogger(wrapped); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged */ public void diag(final Marker marker, final Message msg) { logger.log(DIAG, marker, msg); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged * @param t A Throwable or null. */ public void diag(final Marker marker, final Message msg, final Throwable t) { logger.log(DIAG, marker, msg, t); } /** * Logs a message object with the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void diag(final Marker marker, final Object message) { logger.log(DIAG, marker, message); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final Marker marker, final Object message, final Throwable t) { logger.log(DIAG, marker, message, t); } /** * Logs a message object with the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void diag(final Marker marker, final String message) { logger.log(DIAG, marker, message); } /** * Logs a message with parameters at the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void diag(final Marker marker, final String message, final Object... params) { logger.log(DIAG, marker, message, params); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final Marker marker, final String message, final Throwable t) { logger.log(DIAG, marker, message, t); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param msg the message string to be logged */ public void diag(final Message msg) { logger.log(DIAG, msg); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param msg the message string to be logged * @param t A Throwable or null. */ public void diag(final Message msg, final Throwable t) { logger.log(DIAG, msg, t); } /** * Logs a message object with the {@code DIAG} level. * * @param message the message object to log. */ public void diag(final Object message) { logger.log(DIAG, message); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final Object message, final Throwable t) { logger.log(DIAG, message, t); } /** * Logs a message object with the {@code DIAG} level. * * @param message the message object to log. */ public void diag(final String message) { logger.log(DIAG, message); } /** * Logs a message with parameters at the {@code DIAG} level. * * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void diag(final String message, final Object... params) { logger.log(DIAG, message, params); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final String message, final Throwable t) { logger.log(DIAG, message, t); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged */ public void notice(final Marker marker, final Message msg) { logger.log(NOTICE, marker, msg); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged * @param t A Throwable or null. */ public void notice(final Marker marker, final Message msg, final Throwable t) { logger.log(NOTICE, marker, msg, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void notice(final Marker marker, final Object message) { logger.log(NOTICE, marker, message); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final Marker marker, final Object message, final Throwable t) { logger.log(NOTICE, marker, message, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void notice(final Marker marker, final String message) { logger.log(NOTICE, marker, message); } /** * Logs a message with parameters at the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void notice(final Marker marker, final String message, final Object... params) { logger.log(NOTICE, marker, message, params); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final Marker marker, final String message, final Throwable t) { logger.log(NOTICE, marker, message, t); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param msg the message string to be logged */ public void notice(final Message msg) { logger.log(NOTICE, msg); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param msg the message string to be logged * @param t A Throwable or null. */ public void notice(final Message msg, final Throwable t) { logger.log(NOTICE, msg, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param message the message object to log. */ public void notice(final Object message) { logger.log(NOTICE, message); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final Object message, final Throwable t) { logger.log(NOTICE, message, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param message the message object to log. */ public void notice(final String message) { logger.log(NOTICE, message); } /** * Logs a message with parameters at the {@code NOTICE} level. * * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void notice(final String message, final Object... params) { logger.log(NOTICE, message, params); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final String message, final Throwable t) { logger.log(NOTICE, message, t); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged */ public void verbose(final Marker marker, final Message msg) { logger.log(VERBOSE, marker, msg); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged * @param t A Throwable or null. */ public void verbose(final Marker marker, final Message msg, final Throwable t) { logger.log(VERBOSE, marker, msg, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void verbose(final Marker marker, final Object message) { logger.log(VERBOSE, marker, message); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final Marker marker, final Object message, final Throwable t) { logger.log(VERBOSE, marker, message, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void verbose(final Marker marker, final String message) { logger.log(VERBOSE, marker, message); } /** * Logs a message with parameters at the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void verbose(final Marker marker, final String message, final Object... params) { logger.log(VERBOSE, marker, message, params); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final Marker marker, final String message, final Throwable t) { logger.log(VERBOSE, marker, message, t); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param msg the message string to be logged */ public void verbose(final Message msg) { logger.log(VERBOSE, msg); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param msg the message string to be logged * @param t A Throwable or null. */ public void verbose(final Message msg, final Throwable t) { logger.log(VERBOSE, msg, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param message the message object to log. */ public void verbose(final Object message) { logger.log(VERBOSE, message); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final Object message, final Throwable t) { logger.log(VERBOSE, message, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param message the message object to log. */ public void verbose(final String message) { logger.log(VERBOSE, message); } /** * Logs a message with parameters at the {@code VERBOSE} level. * * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void verbose(final String message, final Object... params) { logger.log(VERBOSE, message, params); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final String message, final Throwable t) { logger.log(VERBOSE, message, t); } } {code} was (Author: rem...@yahoo.com): Attached a first attempt at a source code generator (Generate.java). Usage: Command to generate a wrapper that extends AbstractLoggerWrapper: {{java org.apache.logging.log4j.util.Generate$ExtendedLogger com.mycomp.ExtLogger DIAG=350 NOTICE=450 VERBOSE=550}} Command to generate a wrapper that only provides convenience methods for the specified custom levels (and hides the convenience methods for the built-in levels): {{java org.apache.logging.log4j.util.Generate$CustomLogger com.mycomp.MyLogger DEFCON1=350 DEFCON2=450 DEFCON3=550}} Example generated source: {code} package com.mycomp; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.MessageFactory; import org.apache.logging.log4j.spi.AbstractLogger; import org.apache.logging.log4j.spi.AbstractLoggerWrapper; /** * Extended Logger interface with convenience methods for * the DIAG, NOTICE and VERBOSE custom log levels. */ public final class ExtLogger extends AbstractLoggerWrapper { private static final long serialVersionUID = 216489351472874L; private static final Level DIAG = Level.getOrCreateLevel("DIAG", 350); private static final Level NOTICE = Level.getOrCreateLevel("NOTICE", 450); private static final Level VERBOSE = Level.getOrCreateLevel("VERBOSE", 550); private ExtLogger(final Logger logger) { super((AbstractLogger) logger, logger.getName(), logger.getMessageFactory()); } /** * Returns a custom Logger with the name of the calling class. * * @return The custom Logger for the calling class. */ public static ExtLogger create() { final Logger wrapped = LogManager.getLogger(); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified name of the Class as * the Logger name. * * @param loggerName The Class whose name should be used as the Logger name. * If null it will default to the calling class. * @return The custom Logger. */ public static ExtLogger create(final Class<?> loggerName) { final Logger wrapped = LogManager.getLogger(loggerName); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified name of the Class as * the Logger name. * * @param loggerName The Class whose name should be used as the Logger name. * If null it will default to the calling class. * @param messageFactory The message factory is used only when creating a * logger, subsequent use does not change the logger but will log * a warning if mismatched. * @return The custom Logger. */ public static ExtLogger create(final Class<?> loggerName, final MessageFactory factory) { final Logger wrapped = LogManager.getLogger(loggerName, factory); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified class name of the value * as the Logger name. * * @param value The value whose class name should be used as the Logger * name. If null the name of the calling class will be used as * the logger name. * @return The custom Logger. */ public static ExtLogger create(final Object value) { final Logger wrapped = LogManager.getLogger(value); return new ExtLogger(wrapped); } /** * Returns a custom Logger using the fully qualified class name of the value * as the Logger name. * * @param value The value whose class name should be used as the Logger * name. If null the name of the calling class will be used as * the logger name. * @param messageFactory The message factory is used only when creating a * logger, subsequent use does not change the logger but will log * a warning if mismatched. * @return The custom Logger. */ public static ExtLogger create(final Object value, final MessageFactory factory) { final Logger wrapped = LogManager.getLogger(value, factory); return new ExtLogger(wrapped); } /** * Returns a custom Logger with the specified name. * * @param name The logger name. If null the name of the calling class will * be used. * @return The custom Logger. */ public static ExtLogger create(final String name) { final Logger wrapped = LogManager.getLogger(name); return new ExtLogger(wrapped); } /** * Returns a custom Logger with the specified name. * * @param name The logger name. If null the name of the calling class will * be used. * @param messageFactory The message factory is used only when creating a * logger, subsequent use does not change the logger but will log * a warning if mismatched. * @return The custom Logger. */ public static ExtLogger create(final String name, final MessageFactory factory) { final Logger wrapped = LogManager.getLogger(name, factory); return new ExtLogger(wrapped); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged */ public void diag(final Marker marker, final Message msg) { logger.log(DIAG, marker, msg); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged * @param t A Throwable or null. */ public void diag(final Marker marker, final Message msg, final Throwable t) { logger.log(DIAG, marker, msg, t); } /** * Logs a message object with the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void diag(final Marker marker, final Object message) { logger.log(DIAG, marker, message); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final Marker marker, final Object message, final Throwable t) { logger.log(DIAG, marker, message, t); } /** * Logs a message object with the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void diag(final Marker marker, final String message) { logger.log(DIAG, marker, message); } /** * Logs a message with parameters at the {@code DIAG} level. * * @param marker the marker data specific to this log statement * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void diag(final Marker marker, final String message, final Object... params) { logger.log(DIAG, marker, message, params); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final Marker marker, final String message, final Throwable t) { logger.log(DIAG, marker, message, t); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param msg the message string to be logged */ public void diag(final Message msg) { logger.log(DIAG, msg); } /** * Logs a message with the specific Marker at the {@code DIAG} level. * * @param msg the message string to be logged * @param t A Throwable or null. */ public void diag(final Message msg, final Throwable t) { logger.log(DIAG, msg, t); } /** * Logs a message object with the {@code DIAG} level. * * @param message the message object to log. */ public void diag(final Object message) { logger.log(DIAG, message); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final Object message, final Throwable t) { logger.log(DIAG, message, t); } /** * Logs a message object with the {@code DIAG} level. * * @param message the message object to log. */ public void diag(final String message) { logger.log(DIAG, message); } /** * Logs a message with parameters at the {@code DIAG} level. * * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void diag(final String message, final Object... params) { logger.log(DIAG, message, params); } /** * Logs a message at the {@code DIAG} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void diag(final String message, final Throwable t) { logger.log(DIAG, message, t); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged */ public void notice(final Marker marker, final Message msg) { logger.log(NOTICE, marker, msg); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged * @param t A Throwable or null. */ public void notice(final Marker marker, final Message msg, final Throwable t) { logger.log(NOTICE, marker, msg, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void notice(final Marker marker, final Object message) { logger.log(NOTICE, marker, message); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final Marker marker, final Object message, final Throwable t) { logger.log(NOTICE, marker, message, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void notice(final Marker marker, final String message) { logger.log(NOTICE, marker, message); } /** * Logs a message with parameters at the {@code NOTICE} level. * * @param marker the marker data specific to this log statement * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void notice(final Marker marker, final String message, final Object... params) { logger.log(NOTICE, marker, message, params); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final Marker marker, final String message, final Throwable t) { logger.log(NOTICE, marker, message, t); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param msg the message string to be logged */ public void notice(final Message msg) { logger.log(NOTICE, msg); } /** * Logs a message with the specific Marker at the {@code NOTICE} level. * * @param msg the message string to be logged * @param t A Throwable or null. */ public void notice(final Message msg, final Throwable t) { logger.log(NOTICE, msg, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param message the message object to log. */ public void notice(final Object message) { logger.log(NOTICE, message); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final Object message, final Throwable t) { logger.log(NOTICE, message, t); } /** * Logs a message object with the {@code NOTICE} level. * * @param message the message object to log. */ public void notice(final String message) { logger.log(NOTICE, message); } /** * Logs a message with parameters at the {@code NOTICE} level. * * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void notice(final String message, final Object... params) { logger.log(NOTICE, message, params); } /** * Logs a message at the {@code NOTICE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void notice(final String message, final Throwable t) { logger.log(NOTICE, message, t); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged */ public void verbose(final Marker marker, final Message msg) { logger.log(VERBOSE, marker, msg); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param msg the message string to be logged * @param t A Throwable or null. */ public void verbose(final Marker marker, final Message msg, final Throwable t) { logger.log(VERBOSE, marker, msg, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void verbose(final Marker marker, final Object message) { logger.log(VERBOSE, marker, message); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final Marker marker, final Object message, final Throwable t) { logger.log(VERBOSE, marker, message, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param message the message object to log. */ public void verbose(final Marker marker, final String message) { logger.log(VERBOSE, marker, message); } /** * Logs a message with parameters at the {@code VERBOSE} level. * * @param marker the marker data specific to this log statement * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void verbose(final Marker marker, final String message, final Object... params) { logger.log(VERBOSE, marker, message, params); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param marker the marker data specific to this log statement * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final Marker marker, final String message, final Throwable t) { logger.log(VERBOSE, marker, message, t); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param msg the message string to be logged */ public void verbose(final Message msg) { logger.log(VERBOSE, msg); } /** * Logs a message with the specific Marker at the {@code VERBOSE} level. * * @param msg the message string to be logged * @param t A Throwable or null. */ public void verbose(final Message msg, final Throwable t) { logger.log(VERBOSE, msg, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param message the message object to log. */ public void verbose(final Object message) { logger.log(VERBOSE, message); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final Object message, final Throwable t) { logger.log(VERBOSE, message, t); } /** * Logs a message object with the {@code VERBOSE} level. * * @param message the message object to log. */ public void verbose(final String message) { logger.log(VERBOSE, message); } /** * Logs a message with parameters at the {@code VERBOSE} level. * * @param message the message to log; the format depends on the message factory. * @param params parameters to the message. * @see #getMessageFactory() */ public void verbose(final String message, final Object... params) { logger.log(VERBOSE, message, params); } /** * Logs a message at the {@code VERBOSE} level including the stack trace of * the {@link Throwable} {@code t} passed as parameter. * * @param message the message to log. * @param t the exception to log, including its stack trace. */ public void verbose(final String message, final Throwable t) { logger.log(VERBOSE, message, t); } } {code} > Custom/Extended Loggers > ----------------------- > > Key: LOG4J2-519 > URL: https://issues.apache.org/jira/browse/LOG4J2-519 > Project: Log4j 2 > Issue Type: New Feature > Components: API > Affects Versions: 2.0-rc1 > Reporter: Remko Popma > Attachments: Generate.java > > > *[#Extending] the Logger interface* > LOG4J2-41 added support for custom log Levels. Users can now log messages at > the new custom level by passing the custom level to the {{Logger.log()}} > method: > {code} > final Logger logger = LogManager.getLogger(); > final Level VERBOSE = Level.getOrCreateLevel("VERBOSE", 550); > logger.log(VERBOSE, "a verbose message"); > logger.log(VERBOSE, "another message"); > {code} > However, custom levels are not as easy to use as the built-in levels: one > needs to call the generic {{log()}} method and pass a {{Level}} parameter. > Built-in levels on the other hand have a set of convenience methods on the > Logger interface. For example, the Logger interface has 14 debug methods that > support the DEBUG level: > {code} > debug(Marker, Message) > debug(Marker, Message, Throwable) > debug(Marker, Object) > debug(Marker, Object, Throwable) > debug(Marker, String) > debug(Marker, String, Object...) > debug(Marker, String, Throwable) > debug(Message) > debug(Message, Throwable) > debug(Object) > debug(Object, Throwable) > debug(String) > debug(String, Object...) > debug(String, Throwable) > {code} > Similar method sets exist for the other built-in levels. > Several people have expressed the desire to have the same ease of use with > custom levels, so after declaring a custom VERBOSE level, we would like to be > able to use code like this: > {code} > logger.verbose("a verbose message"); // no need to pass the VERBOSE level as > a parameter > logger.verbose("another message"); > {code} > *[#Customizing] the Logger interface* > In the above use case, convenience methods were _added_ to the Logger > interface, in addition to the existing {{trace()}}, {{debug()}}, {{info()}}, > ... methods for the built-in log levels. > There is another use case, Domain Specific Language loggers, where we want to > _replace_ the existing {{trace()}}, {{debug()}}, {{info()}}, ... methods with > all-custom methods. > For example, for medical devices we could have only {{critical()}}, > {{warning()}}, and {{advisory()}} methods. Another example could be a game > that has only {{defcon1()}}, {{defcon2()}}, and {{defcon3()}} levels. > Finally, if it were possible to hide existing log levels, users could > customize the Logger interface to match their requirements. Some people may > not want to have a {{FATAL}} or a {{TRACE}} level, for example. They would > like to be able to create a custom Logger that only has {{debug()}}, > {{info()}}, {{warn()}} and {{error()}} methods. > *[#Proposal]: Generate source code for a Logger wrapper* > Common log4j usage is to get an instance of the {{Logger}} interface from the > {{LogManager}} and call the methods on this interface. This makes it hard to > achieve the above customization; especially taking away existing methods is > not possible. > An alternative is for the user to create a wrapper class that exposes only > the convenience methods for the desired log levels. When _extending_ the > {{Logger}} API (_adding_ methods), this wrapper class could subclass > {{org.apache.logging.log4j.spi.AbstractLoggerWrapper}}. When _customizing_ > the {{Logger}} API (_removing_ built-in methods), the wrapper class would > simply not extend AbstractLoggerWrapper, so the only public methods would be > the methods for the custom log levels. > As the custom log Levels are not known in advance, Log4J cannot provide > pre-built wrapper classes for these custom log Levels. However, we don't want > to ask the users to hand-code such a wrapper class: this is cumbersome and > error-prone: there are 14 methods for each built-in level. To provide > comparable functionality for custom log Levels one would need to provide 14 > methods for each custom log Level. > The proposal is to solve this by providing a tool that generates the source > code for a wrapper class. The user can specify: > * the fully qualified name of the class to generate > * the list of custom levels to support and their {{intLevel}} relative > strength > * whether to extend {{Logger}} (and keep the existing built-in methods) or > have only methods for the custom log levels > and the tool generates the source code for the wrapper class that has exactly > the required methods. Users would include this source code in the project > where they want to use custom log levels. > Note that no Log4J API changes are required to support this functionality. > Users would create instances of the wrapper by calling a factory method on > the wrapper class, instead of calling the {{LogManager.getLogger()}} methods. > For example, instead of writing: > {code} > import org.apache.logging.log4j.Level; > import org.apache.logging.log4j.LogManager; > import org.apache.logging.log4j.Logger; > final Logger logger = LogManager.getLogger(MyClass.class); // standard log4j > logger > final Level VERBOSE = Level.forName("VERBOSE", 550); > logger.log(VERBOSE, "a verbose message"); > {code} > users would instead write: > {code} > // MyLogger is a generated customized logger wrapper > import com.mycompany.myproject.MyLogger; > final MyLogger logger = MyLogger.create(MyClass.class); > logger.verbose("a verbose message"); > {code} > Creating an extended or customized Logger is as easy as creating a standard > Logger (one line of code). Extended Loggers are drop-in replacements for > standard Loggers - they only add more convenience methods. -- This message was sent by Atlassian JIRA (v6.1.5#6160) --------------------------------------------------------------------- To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org For additional commands, e-mail: log4j-dev-h...@logging.apache.org