/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _LOG4CXX_LOGGER_H
#define _LOG4CXX_LOGGER_H

#if defined(_MSC_VER) && (_MSC_VER < 1900)
#pragma warning ( push )
#pragma warning ( disable: 4127 )
#endif
#if defined(_MSC_VER)
#pragma warning ( push )
#pragma warning ( disable: 4231 4251 4275 4786 )
#endif

#include <log4cxx/helpers/appenderattachableimpl.h>
#include <log4cxx/level.h>
#include <log4cxx/helpers/pool.h>
#include <log4cxx/spi/location/locationinfo.h>
#include <log4cxx/helpers/resourcebundle.h>
#include <log4cxx/helpers/messagebuffer.h>
#include <shared_mutex>
#include <atomic>

namespace log4cxx
{

namespace helpers
{
class synchronized;
}

namespace spi
{
class LoggerRepository;
LOG4CXX_PTR_DEF(LoggerRepository);
class LoggerFactory;
LOG4CXX_PTR_DEF(LoggerFactory);
}

class Logger;
/** smart pointer to a Logger class */
LOG4CXX_PTR_DEF(Logger);
LOG4CXX_LIST_DEF(LoggerList, LoggerPtr);


/**
This is the central class in the log4cxx package. Most logging
operations, except configuration, are done through this class.
*/
class LOG4CXX_EXPORT Logger :
    public virtual log4cxx::spi::AppenderAttachable,
    public virtual helpers::Object
{
public:
    DECLARE_ABSTRACT_LOG4CXX_OBJECT(Logger)
    BEGIN_LOG4CXX_CAST_MAP()
    LOG4CXX_CAST_ENTRY(Logger)
    LOG4CXX_CAST_ENTRY(spi::AppenderAttachable)
    END_LOG4CXX_CAST_MAP()

private:
    /**
     *   Reference to memory pool.
     */
    helpers::Pool* pool;

protected:
    /**
    The name of this logger.
    */
    LogString name;

    /**
    The assigned level of this logger.  The
    <code>level</code> variable need not be assigned a value in
    which case it is inherited form the hierarchy.  */
    LevelPtr level;

    /**
    The parent of this logger. All loggers have at least one
    ancestor which is the root logger. */
    LoggerPtr parent;

    /** The resourceBundle for localized messages.

    @see setResourceBundle, getResourceBundle
    */
    helpers::ResourceBundlePtr resourceBundle;


    // Loggers need to know what Hierarchy they are in
    log4cxx::spi::LoggerRepository* repository;

    helpers::AppenderAttachableImplPtr aai;

    /** Additivity is set to true by default, that is children inherit
            the appenders of their ancestors by default. If this variable is
            set to <code>false</code> then the appenders found in the
            ancestors of this logger are not used. However, the children
            of this logger will inherit its appenders, unless the children
            have their additivity flag set to <code>false</code> too. See
            the user manual for more details. */
	std::atomic<bool> additive;

protected:
    friend class DefaultLoggerFactory;

    /**
    This constructor created a new <code>logger</code> instance and
    sets its name.

    <p>It is intended to be used by sub-classes only. You should not
    create categories directly.

    @param pool lifetime of pool must be longer than logger.
    @param name The name of the logger.
    */
    Logger(log4cxx::helpers::Pool& pool, const LogString& name);

public:
    ~Logger();


    /**
    Add <code>newAppender</code> to the list of appenders of this
    Logger instance.

    <p>If <code>newAppender</code> is already in the list of
    appenders, then it won't be added again.
    */
    virtual void addAppender(const AppenderPtr newAppender);


    /**
    Call the appenders in the hierrachy starting at
    <code>this</code>.  If no appenders could be found, emit a
    warning.

    <p>This method calls all the appenders inherited from the
    hierarchy circumventing any evaluation of whether to log or not
    to log the particular log request.

    @param event the event to log.
    @param p memory pool for any allocations needed to process request.
    */
    void callAppenders(const log4cxx::spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p) const;

    /**
    Close all attached appenders implementing the AppenderAttachable
    interface.
    */
    void closeNestedAppenders();

    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void debug(const std::string& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void debug(const std::string& msg) const;
#if LOG4CXX_WCHAR_T_API
    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void debug(const std::wstring& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void debug(const std::wstring& msg) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void debug(const std::basic_string<UniChar>& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void debug(const std::basic_string<UniChar>& msg) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void debug(const CFStringRef& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the DEBUG level.

    <p>This method first checks if this logger is <code>DEBUG</code>
    enabled by comparing the level of this logger with the
    DEBUG level. If this logger is
    <code>DEBUG</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void debug(const CFStringRef& msg) const;
#endif

    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void error(const std::string& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void error(const std::string& msg) const;
#if LOG4CXX_WCHAR_T_API
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void error(const std::wstring& msg) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void error(const std::wstring& msg, const log4cxx::spi::LocationInfo& location) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void error(const std::basic_string<UniChar>& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void error(const std::basic_string<UniChar>& msg) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void error(const CFStringRef& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void error(const CFStringRef& msg) const;
#endif

    /**
    Log a message string with the FATAL level.

    <p>This method first checks if this logger is <code>FATAL</code>
    enabled by comparing the level of this logger with the
    FATAL level. If this logger is
    <code>FATAL</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void fatal(const std::string& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void fatal(const std::string& msg) const;
#if LOG4CXX_WCHAR_T_API
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void fatal(const std::wstring& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void fatal(const std::wstring& msg) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void fatal(const std::basic_string<UniChar>& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void fatal(const std::basic_string<UniChar>& msg) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void fatal(const CFStringRef& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the ERROR level.

    <p>This method first checks if this logger is <code>ERROR</code>
    enabled by comparing the level of this logger with the
    ERROR level. If this logger is
    <code>ERROR</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void fatal(const CFStringRef& msg) const;
#endif

    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    @param location location of source of logging request.
    */
    void forcedLog(const LevelPtr& level, const std::string& message,
                   const log4cxx::spi::LocationInfo& location) const;
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    */
    void forcedLog(const LevelPtr& level, const std::string& message) const;

#if LOG4CXX_WCHAR_T_API
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    @param location location of source of logging request.
    */
    void forcedLog(const LevelPtr& level, const std::wstring& message,
                   const log4cxx::spi::LocationInfo& location) const;
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    */
    void forcedLog(const LevelPtr& level, const std::wstring& message) const;
#endif
#if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    @param location location of source of logging request.
    */
    void forcedLog(const LevelPtr& level, const std::basic_string<UniChar>& message,
                   const log4cxx::spi::LocationInfo& location) const;
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    */
    void forcedLog(const LevelPtr& level, const std::basic_string<UniChar>& message) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    @param location location of source of logging request.
    */
    void forcedLog(const LevelPtr& level, const CFStringRef& message,
                   const log4cxx::spi::LocationInfo& location) const;
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message message.
    */
    void forcedLog(const LevelPtr& level, const CFStringRef& message) const;
#endif
    /**
    This method creates a new logging event and logs the event
    without further checks.
    @param level the level to log.
    @param message the message string to log.
    @param location location of the logging statement.
    */
    void forcedLogLS(const LevelPtr& level, const LogString& message,
                     const log4cxx::spi::LocationInfo& location) const;

    /**
    Get the additivity flag for this Logger instance.
    */
    bool getAdditivity() const;

    /**
    Get the appenders contained in this logger as an AppenderList.
    If no appenders can be found, then an empty AppenderList
    is returned.
    @return AppenderList An collection of the appenders in this logger.*/
    AppenderList getAllAppenders() const;

    /**
    Look for the appender named as <code>name</code>.
    <p>Return the appender with that name if in the list. Return
    <code>NULL</code> otherwise.  */
    AppenderPtr getAppender(const LogString& name) const;

    /**
    Starting from this logger, search the logger hierarchy for a
    non-null level and return it.

    <p>The Logger class is designed so that this method executes as
    quickly as possible.

    @throws RuntimeException if all levels are null in the hierarchy
    */
    virtual const LevelPtr getEffectiveLevel() const;

    /**
    Return the the LoggerRepository where this
    <code>Logger</code> is attached.
    */
    log4cxx::spi::LoggerRepository* getLoggerRepository() const;


    /**
    * Get the logger name.
    * @return logger name as LogString.
    */
    const LogString& getName() const
    {
        return name;
    }
    /**
    * Get logger name in current encoding.
    * @param name buffer to which name is appended.
    */
    void getName(std::string& name) const;
#if LOG4CXX_WCHAR_T_API
    /**
    * Get logger name.
    * @param name buffer to which name is appended.
    */
    void getName(std::wstring& name) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    * Get logger name.
    * @param name buffer to which name is appended.
    */
    void getName(std::basic_string<UniChar>& name) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    * Get logger name.
    * @param name buffer to which name is appended.
    */
    void getName(CFStringRef& name) const;
#endif

    /**
    Returns the parent of this logger. Note that the parent of a
    given logger may change during the lifetime of the logger.

    <p>The root logger will return <code>0</code>.
    */
    LoggerPtr getParent() const;


    /**
    Returns the assigned Level, if any, for this Logger.

    @return Level - the assigned Level, can be null.
    */
    LevelPtr getLevel() const;

    /**
    * Retrieve a logger by name in current encoding.
    * @param name logger name.
    */
    static LoggerPtr getLogger(const std::string& name);
    /**
    * Retrieve a logger by name in current encoding.
    * @param name logger name.
    */
    static LoggerPtr getLogger(const char* const name);
#if LOG4CXX_WCHAR_T_API
    /**
    * Retrieve a logger by name.
    * @param name logger name.
    */
    static LoggerPtr getLogger(const std::wstring& name);
    /**
    * Retrieve a logger by name.
    * @param name logger name.
    */
    static LoggerPtr getLogger(const wchar_t* const name);
#endif
#if LOG4CXX_UNICHAR_API
    /**
    * Retrieve a logger by name.
    * @param name logger name.
    */
    static LoggerPtr getLogger(const std::basic_string<UniChar>& name);
#endif
#if LOG4CXX_CFSTRING_API
    /**
    * Retrieve a logger by name.
    * @param name logger name.
    */
    static LoggerPtr getLogger(const CFStringRef& name);
#endif
    /**
    * Retrieve a logger by name in Unicode.
    * @param name logger name.
    */
    static LoggerPtr getLoggerLS(const LogString& name);

    /**
    Retrieve the root logger.
    */
    static LoggerPtr getRootLogger();

    /**
    Like #getLogger except that the type of logger
    instantiated depends on the type returned by the
    LoggerFactory#makeNewLoggerInstance method of the
    <code>factory</code> parameter.

    <p>This method is intended to be used by sub-classes.

    @param name The name of the logger to retrieve.

    @param factory A LoggerFactory implementation that will
    actually create a new Instance.
    */
    static LoggerPtr getLoggerLS(const LogString& name,
                                 const log4cxx::spi::LoggerFactoryPtr& factory);
    /**
    Like #getLogger except that the type of logger
    instantiated depends on the type returned by the
    LoggerFactory#makeNewLoggerInstance method of the
    <code>factory</code> parameter.

    <p>This method is intended to be used by sub-classes.

    @param name The name of the logger to retrieve.

    @param factory A LoggerFactory implementation that will
    actually create a new Instance.
    */
    static LoggerPtr getLogger(const std::string& name,
                               const log4cxx::spi::LoggerFactoryPtr& factory);
#if LOG4CXX_WCHAR_T_API
    /**
    Like #getLogger except that the type of logger
    instantiated depends on the type returned by the
    LoggerFactory#makeNewLoggerInstance method of the
    <code>factory</code> parameter.

    <p>This method is intended to be used by sub-classes.

    @param name The name of the logger to retrieve.

    @param factory A LoggerFactory implementation that will
    actually create a new Instance.
    */
    static LoggerPtr getLogger(const std::wstring& name,
                               const log4cxx::spi::LoggerFactoryPtr& factory);
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Like #getLogger except that the type of logger
    instantiated depends on the type returned by the
    LoggerFactory#makeNewLoggerInstance method of the
    <code>factory</code> parameter.

    <p>This method is intended to be used by sub-classes.

    @param name The name of the logger to retrieve.

    @param factory A LoggerFactory implementation that will
    actually create a new Instance.
    */
    static LoggerPtr getLogger(const std::basic_string<UniChar>& name,
                               const log4cxx::spi::LoggerFactoryPtr& factory);
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Like #getLogger except that the type of logger
    instantiated depends on the type returned by the
    LoggerFactory#makeNewLoggerInstance method of the
    <code>factory</code> parameter.

    <p>This method is intended to be used by sub-classes.

    @param name The name of the logger to retrieve.

    @param factory A LoggerFactory implementation that will
    actually create a new Instance.
    */
    static LoggerPtr getLogger(const CFStringRef& name,
                               const log4cxx::spi::LoggerFactoryPtr& factory);
#endif

    /**
    Return the <em>inherited</em> ResourceBundle for this logger.


    This method walks the hierarchy to find the appropriate resource bundle.
    It will return the resource bundle attached to the closest ancestor of
    this logger, much like the way priorities are searched. In case there
    is no bundle in the hierarchy then <code>NULL</code> is returned.
    */
    helpers::ResourceBundlePtr getResourceBundle() const;

protected:
    /**
    Returns the string resource coresponding to <code>key</code> in this
    logger's inherited resource bundle.

    If the resource cannot be found, then an {@link #error error} message
    will be logged complaining about the missing resource.

    @see #getResourceBundle.
    */
    LogString getResourceBundleString(const LogString& key) const;

public:
    /**
    Log a message string with the INFO level.

    <p>This method first checks if this logger is <code>INFO</code>
    enabled by comparing the level of this logger with the
    INFO level. If this logger is
    <code>INFO</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
            */
    void info(const std::string& msg, const log4cxx::spi::LocationInfo& location) const;
    void info(const std::string& msg) const;
#if LOG4CXX_WCHAR_T_API
    /**
    Log a message string with the INFO level.

    <p>This method first checks if this logger is <code>INFO</code>
    enabled by comparing the level of this logger with the
    INFO level. If this logger is
    <code>INFO</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
            */
    void info(const std::wstring& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the INFO level.

    <p>This method first checks if this logger is <code>INFO</code>
    enabled by comparing the level of this logger with the
    INFO level. If this logger is
    <code>INFO</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
            */
    void info(const std::wstring& msg) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Log a message string with the INFO level.

    <p>This method first checks if this logger is <code>INFO</code>
    enabled by comparing the level of this logger with the
    INFO level. If this logger is
    <code>INFO</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
            */
    void info(const std::basic_string<UniChar>& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the INFO level.

    <p>This method first checks if this logger is <code>INFO</code>
    enabled by comparing the level of this logger with the
    INFO level. If this logger is
    <code>INFO</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
            */
    void info(const std::basic_string<UniChar>& msg) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Log a message string with the INFO level.

    <p>This method first checks if this logger is <code>INFO</code>
    enabled by comparing the level of this logger with the
    INFO level. If this logger is
    <code>INFO</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
            */
    void info(const CFStringRef& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the INFO level.

    <p>This method first checks if this logger is <code>INFO</code>
    enabled by comparing the level of this logger with the
    INFO level. If this logger is
    <code>INFO</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
            */
    void info(const CFStringRef& msg) const;
#endif

    /**
    Is the appender passed as parameter attached to this logger?
    */
    bool isAttached(const AppenderPtr appender) const;

    /**
     *  Check whether this logger is enabled for the <code>DEBUG</code>
     *  Level.
     *
     *  <p> This function is intended to lessen the computational cost of
     *  disabled log debug statements.
     *
     *  <p> For some <code>logger</code> Logger object, when you write,
     *  <pre>
     *      logger->debug("debug message");
     *  </pre>
     *
     *  <p>You incur the cost constructing the message, concatenation in
     *  this case, regardless of whether the message is logged or not.
     *
     *  <p>If you are worried about speed, then you should write
     *  <pre>
     *    if(logger->isDebugEnabled()) {
     *      logger->debug("debug message");
     *    }
     *  </pre>
     *
     *  <p>This way you will not incur the cost of parameter
     *  construction if debugging is disabled for <code>logger</code>. On
     *  the other hand, if the <code>logger</code> is debug enabled, you
     *  will incur the cost of evaluating whether the logger is debug
     *  enabled twice. Once in <code>isDebugEnabled</code> and once in
     *  the <code>debug</code>.  This is an insignificant overhead
     *  since evaluating a logger takes about 1%% of the time it
     *  takes to actually log.
     *
     *  @return bool - <code>true</code> if this logger is debug
     *  enabled, <code>false</code> otherwise.
     *   */
    bool isDebugEnabled() const;

    /**
    Check whether this logger is enabled for a given
    Level passed as parameter.

    See also #isDebugEnabled.

    @return bool True if this logger is enabled for <code>level</code>.
    */
    bool isEnabledFor(const LevelPtr& level) const;


    /**
    Check whether this logger is enabled for the info Level.
    See also #isDebugEnabled.

    @return bool - <code>true</code> if this logger is enabled
    for level info, <code>false</code> otherwise.
    */
    bool isInfoEnabled() const;

    /**
    Check whether this logger is enabled for the warn Level.
    See also #isDebugEnabled.

    @return bool - <code>true</code> if this logger is enabled
    for level warn, <code>false</code> otherwise.
    */
    bool isWarnEnabled() const;

    /**
    Check whether this logger is enabled for the error Level.
    See also #isDebugEnabled.

    @return bool - <code>true</code> if this logger is enabled
    for level error, <code>false</code> otherwise.
    */
    bool isErrorEnabled() const;

    /**
    Check whether this logger is enabled for the fatal Level.
    See also #isDebugEnabled.

    @return bool - <code>true</code> if this logger is enabled
    for level fatal, <code>false</code> otherwise.
    */
    bool isFatalEnabled() const;

    /**
    Check whether this logger is enabled for the trace level.
    See also #isDebugEnabled.

    @return bool - <code>true</code> if this logger is enabled
    for level trace, <code>false</code> otherwise.
    */
    bool isTraceEnabled() const;

    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param values The values for the placeholders <code>{0}</code>,
                  <code>{1}</code> etc. within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const LogString& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::vector<LogString>& values) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::string& key,
                const log4cxx::spi::LocationInfo& locationInfo) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The first value for the placeholders within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::string& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::string& val1) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The first value for the placeholders within the pattern.
    @param val2 The second value for the placeholders within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::string& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::string& val1, const std::string& val2) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.
    @param val2 The value for the second placeholder within the pattern.
    @param val3 The value for the third placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::string& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::string& val1, const std::string& val2, const std::string& val3) const;

#if LOG4CXX_WCHAR_T_API
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::wstring& key,
                const log4cxx::spi::LocationInfo& locationInfo) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::wstring& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::wstring& val1) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.
    @param val2 The value for the second placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::wstring& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::wstring& val1, const std::wstring& val2) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.
    @param val2 The value for the second placeholder within the pattern.
    @param val3 The value for the third placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::wstring& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::wstring& val1, const std::wstring& val2, const std::wstring& val3) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::basic_string<UniChar>& key,
                const log4cxx::spi::LocationInfo& locationInfo) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::basic_string<UniChar>& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::basic_string<UniChar>& val1) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.
    @param val2 The value for the second placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::basic_string<UniChar>& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::basic_string<UniChar>& val1, const std::basic_string<UniChar>& val2) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.
    @param val2 The value for the second placeholder within the pattern.
    @param val3 The value for the third placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const std::basic_string<UniChar>& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const std::basic_string<UniChar>& val1, const std::basic_string<UniChar>& val2,
                const std::basic_string<UniChar>& val3) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const CFStringRef& key,
                const log4cxx::spi::LocationInfo& locationInfo) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const CFStringRef& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const CFStringRef& val1) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.
    @param val2 The value for the second placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const CFStringRef& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const CFStringRef& val1, const CFStringRef& val2) const;
    /**
    Log a localized and parameterized message.

    First, the user supplied
    <code>key</code> is searched in the resource bundle. Next, the resulting
    pattern is formatted using helpers::StringHelper::format method with the user
    supplied string array <code>params</code>.

    @param level The level of the logging request.
    @param key The key to be searched in the ResourceBundle.
    @param locationInfo The location info of the logging request.
    @param val1 The value for the first placeholder within the pattern.
    @param val2 The value for the second placeholder within the pattern.
    @param val3 The value for the third placeholder within the pattern.

    @see #setResourceBundle
    */
    void l7dlog(const LevelPtr& level, const CFStringRef& key,
                const log4cxx::spi::LocationInfo& locationInfo,
                const CFStringRef& val1, const CFStringRef& val2,
                const CFStringRef& val3) const;
#endif

    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    @param location The source file of the logging request, may be null. */
    void log(const LevelPtr& level, const std::string& message,
             const log4cxx::spi::LocationInfo& location) const;
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    */
    void log(const LevelPtr& level, const std::string& message) const;
#if LOG4CXX_WCHAR_T_API
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    @param location The source file of the logging request, may be null. */
    void log(const LevelPtr& level, const std::wstring& message,
             const log4cxx::spi::LocationInfo& location) const;
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    */
    void log(const LevelPtr& level, const std::wstring& message) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    @param location The source file of the logging request, may be null. */
    void log(const LevelPtr& level, const std::basic_string<UniChar>& message,
             const log4cxx::spi::LocationInfo& location) const;
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    */
    void log(const LevelPtr& level, const std::basic_string<UniChar>& message) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    @param location The source file of the logging request, may be null. */
    void log(const LevelPtr& level, const CFStringRef& message,
             const log4cxx::spi::LocationInfo& location) const;
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    */
    void log(const LevelPtr& level, const CFStringRef& message) const;
#endif
    /**
    This is the most generic printing method. It is intended to be
    invoked by <b>wrapper</b> classes.

    @param level The level of the logging request.
    @param message The message of the logging request.
    @param location The source file of the logging request, may be null. */
    void logLS(const LevelPtr& level, const LogString& message,
               const log4cxx::spi::LocationInfo& location) const;



    /**
    Remove all previously added appenders from this logger
    instance.
    <p>This is useful when re-reading configuration information.
    */
    void removeAllAppenders();

    /**
    Remove the appender passed as parameter form the list of appenders.
    */
    void removeAppender(const AppenderPtr appender);

    /**
    Remove the appender with the name passed as parameter form the
    list of appenders.
     */
    void removeAppender(const LogString& name);

    /**
     Set the additivity flag for this Logger instance.
      */
    void setAdditivity(bool additive);

protected:
    friend class Hierarchy;
    /**
    Only the Hierarchy class can set the hierarchy of a logger.*/
    void setHierarchy(spi::LoggerRepository* repository);

public:
    /**
    Set the level of this Logger.

    <p>As in <pre> &nbsp;&nbsp;&nbsp;logger->setLevel(Level::getDebug()); </pre>

    <p>Null values are admitted.  */
    virtual void setLevel(const LevelPtr level);

    /**
    Set the resource bundle to be used with localized logging methods.
    */
    inline void setResourceBundle(const helpers::ResourceBundlePtr& bundle)
    {
        resourceBundle = bundle;
    }

#if LOG4CXX_WCHAR_T_API
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void warn(const std::wstring& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void warn(const std::wstring& msg) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void warn(const std::basic_string<UniChar>& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void warn(const std::basic_string<UniChar>& msg) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void warn(const CFStringRef& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void warn(const CFStringRef& msg) const;
#endif
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void warn(const std::string& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the WARN level.

    <p>This method first checks if this logger is <code>WARN</code>
    enabled by comparing the level of this logger with the
    WARN level. If this logger is
    <code>WARN</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void warn(const std::string& msg) const;

#if LOG4CXX_WCHAR_T_API
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void trace(const std::wstring& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void trace(const std::wstring& msg) const;
#endif
#if LOG4CXX_UNICHAR_API
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void trace(const std::basic_string<UniChar>& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void trace(const std::basic_string<UniChar>& msg) const;
#endif
#if LOG4CXX_CFSTRING_API
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void trace(const CFStringRef& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void trace(const CFStringRef& msg) const;
#endif
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    @param location location of source of logging request.
    */
    void trace(const std::string& msg, const log4cxx::spi::LocationInfo& location) const;
    /**
    Log a message string with the TRACE level.

    <p>This method first checks if this logger is <code>TRACE</code>
    enabled by comparing the level of this logger with the
    TRACE level. If this logger is
    <code>TRACE</code> enabled, it proceeds to call all the
    registered appenders in this logger and also higher in the
    hierarchy depending on the value of the additivity flag.

    @param msg the message string to log.
    */
    void trace(const std::string& msg) const;

    /**
     * Reconfigure this logger by configuring all of the appenders.
     *
     * @param appenders The appenders to set.  Any currently existing appenders are removed.
     * @param additivity The additivity of this logger
     */
    void reconfigure( const std::vector<AppenderPtr>& appenders, bool additivity );

private:
    //
    //  prevent copy and assignment
    Logger(const Logger&);
    Logger& operator=(const Logger&);
    mutable std::shared_mutex mutex;
    friend class log4cxx::helpers::synchronized;
};
LOG4CXX_LIST_DEF(LoggerList, LoggerPtr);

}

/** @addtogroup LoggingMacros Logging macros
@{
*/

#if !defined(LOG4CXX_UNLIKELY)
#if __GNUC__ >= 3
/**
Provides optimization hint to the compiler
to optimize for the expression being false.
@param expr boolean expression.
@returns value of expression.
*/
#define LOG4CXX_UNLIKELY(expr) __builtin_expect(expr, 0)
#else
/**
Provides optimization hint to the compiler
to optimize for the expression being false.
@param expr boolean expression.
@returns value of expression.
**/
#define LOG4CXX_UNLIKELY(expr) expr
#endif
#endif


/**
Logs a message to a specified logger with a specified level.

@param logger the logger to be used.
@param level the level to log.
@param message the message string to log.
*/
#define LOG4CXX_LOG(logger, level, message) do { \
		if (logger->isEnabledFor(level)) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(level, oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)

/**
Logs a message to a specified logger with a specified level.

@param logger the logger to be used.
@param level the level to log.
@param message the message string to log in the internal encoding.
*/
#define LOG4CXX_LOGLS(logger, level, message) do { \
		if (logger->isEnabledFor(level)) {\
			::log4cxx::helpers::LogCharMessageBuffer oss_; \
			logger->forcedLog(level, oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)

#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 10000
/**
Logs a message to a specified logger with the DEBUG level.

@param logger the logger to be used.
@param message the message string to log.
*/
#define LOG4CXX_DEBUG(logger, message) do { \
		if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(::log4cxx::Level::getDebug(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)
#else
#define LOG4CXX_DEBUG(logger, message)
#endif

#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 5000
/**
Logs a message to a specified logger with the TRACE level.

@param logger the logger to be used.
@param message the message string to log.
*/
#define LOG4CXX_TRACE(logger, message) do { \
		if (LOG4CXX_UNLIKELY(logger->isTraceEnabled())) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(::log4cxx::Level::getTrace(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)
#else
#define LOG4CXX_TRACE(logger, message)
#endif

#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 20000
/**
Logs a message to a specified logger with the INFO level.

@param logger the logger to be used.
@param message the message string to log.
*/
#define LOG4CXX_INFO(logger, message) do { \
		if (logger->isInfoEnabled()) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(::log4cxx::Level::getInfo(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)
#else
#define LOG4CXX_INFO(logger, message)
#endif

#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 30000
/**
Logs a message to a specified logger with the WARN level.

@param logger the logger to be used.
@param message the message string to log.
*/
#define LOG4CXX_WARN(logger, message) do { \
		if (logger->isWarnEnabled()) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(::log4cxx::Level::getWarn(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)
#else
#define LOG4CXX_WARN(logger, message)
#endif

#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 40000
/**
Logs a message to a specified logger with the ERROR level.

@param logger the logger to be used.
@param message the message string to log.
*/
#define LOG4CXX_ERROR(logger, message) do { \
		if (logger->isErrorEnabled()) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(::log4cxx::Level::getError(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)

/**
Logs a error if the condition is not true.

@param logger the logger to be used.
@param condition condition
@param message the message string to log.
*/
#define LOG4CXX_ASSERT(logger, condition, message) do { \
		if (!(condition) && logger->isErrorEnabled()) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(::log4cxx::Level::getError(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)

#else
#define LOG4CXX_ERROR(logger, message)
#define LOG4CXX_ASSERT(logger, condition, message)
#endif

#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 50000
/**
Logs a message to a specified logger with the FATAL level.

@param logger the logger to be used.
@param message the message string to log.
*/
#define LOG4CXX_FATAL(logger, message) do { \
		if (logger->isFatalEnabled()) {\
			::log4cxx::helpers::MessageBuffer oss_; \
			logger->forcedLog(::log4cxx::Level::getFatal(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }} while (0)
#else
#define LOG4CXX_FATAL(logger, message)
#endif

/**
Logs a localized message with no parameter.

@param logger the logger to be used.
@param level the level to log.
@param key the key to be searched in the resourceBundle of the logger.
*/
#define LOG4CXX_L7DLOG(logger, level, key) do { \
		if (logger->isEnabledFor(level)) {\
			logger->l7dlog(level, key, LOG4CXX_LOCATION); }} while (0)

/**
Logs a localized message with one parameter.

@param logger the logger to be used.
@param level the level to log.
@param key the key to be searched in the resourceBundle of the logger.
@param p1 the unique parameter.
*/
#define LOG4CXX_L7DLOG1(logger, level, key, p1) do { \
		if (logger->isEnabledFor(level)) {\
			logger->l7dlog(level, key, LOG4CXX_LOCATION, p1); }} while (0)

/**
Logs a localized message with two parameters.

@param logger the logger to be used.
@param level the level to log.
@param key the key to be searched in the resourceBundle of the logger.
@param p1 the first parameter.
@param p2 the second parameter.
*/
#define LOG4CXX_L7DLOG2(logger, level, key, p1, p2) do { \
		if (logger->isEnabledFor(level)) {\
			logger->l7dlog(level, key, LOG4CXX_LOCATION, p1, p2); }} while (0)

/**
Logs a localized message with three parameters.

@param logger the logger to be used.
@param level the level to log.
@param key the key to be searched in the resourceBundle of the logger.
@param p1 the first parameter.
@param p2 the second parameter.
@param p3 the third parameter.
*/
#define LOG4CXX_L7DLOG3(logger, level, key, p1, p2, p3) do { \
		if (logger->isEnabledFor(level)) {\
			logger->l7dlog(level, key, LOG4CXX_LOCATION, p1, p2, p3); }} while (0)

/**@}*/

#if defined(_MSC_VER)
#pragma warning ( pop )
#endif

#include <log4cxx/spi/loggerrepository.h>

#endif //_LOG4CXX_LOGGER_H
