跳转至

使用

输出到控制台

【使用的基本步骤】

  1. 创建Appender对象
  2. 设置Appender的名称和输出格式(即Layout)
  3. 获得一个logger实例,并设置日志输出的等级
  4. 给Logger实例添加Appender
  5. 使用宏输出日志

【简单例子】输出到控制台

#include <log4cplus/log4cplus.h>

int main()
{
    //用Initializer类进行初始化
    log4cplus::Initializer initializer;

    //第1步:创建ConsoleAppender
    log4cplus::SharedAppenderPtr appender(new log4cplus::ConsoleAppender());

    //第2步:设置Appender的名称和输出格式(SimpleLayout)
    appender->setName(LOG4CPLUS_TEXT("console"));
    appender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));

    //第3步:获得一个Logger实例,并设置其日志输出等级阈值
    log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
    logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);

    //第4步:为Logger实例添加ConsoleAppender
    logger.addAppender(appender);

    //第5步:使用宏将日志输出
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));

    return 0;
}

输出到控制台和文件

#include <log4cplus/log4cplus.h>

int main()
{
    //用Initializer类进行初始化
    log4cplus::Initializer initializer;

    //第1步:创建ConsoleAppender和FileAppender(参数app表示内容追加到文件)
    log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender);
    log4cplus::SharedAppenderPtr fileAppender(new log4cplus::FileAppender(
                                                  LOG4CPLUS_TEXT("log.txt"),
                                                  std::ios_base::app
                                                  )
                                              );

    //第2步:设置Appender的名称和输出格式
    //ConsoleAppender使用SimpleLayout
    //FileAppender使用PatternLayout
    consoleAppender->setName(LOG4CPLUS_TEXT("console"));
    consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout()));
    fileAppender->setName(LOG4CPLUS_TEXT("file"));
    log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n");
    fileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern)));

    //第3步:获得一个Logger实例,并设置其日志输出等级阈值
    log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
    logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);

    //第4步:为Logger实例添加ConsoleAppender和FileAppender
    logger.addAppender(consoleAppender);
    logger.addAppender(fileAppender);

    //第5步:使用宏将日志输出
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));

    return 0;
}

输出到日志服务器

#include <log4cplus/log4cplus.h>

int main()
{
    //用Initializer类进行初始化
    log4cplus::Initializer initializer;

    //第1步:创建SocketAppender
    log4cplus::SharedAppenderPtr appender(new log4cplus::SocketAppender(
                                                    LOG4CPLUS_TEXT("localhost"),
                                                    32015, LOG4CPLUS_TEXT("test")));

    //第2步:设置Appender的名称,SocketAppender不需要设置输出格式
    appender->setName(LOG4CPLUS_TEXT("logserver"));

    //第3步:获得一个Logger实例,并设置其日志输出等级阈值
    log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
    logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);

    //第4步:为Logger实例添加Appender
    logger.addAppender(appender);

    //第5步:使用宏将日志输出
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));

    return 0;
}

使用配置文件

配置文件

# 文件名:log4cplus.config

###################################
########Define log Levels##########
###################################

# 告警级别由低到高排序: TRACE  DEBUG  INFO  WARN  ERROR  FATAL 

#All classes - except those in log4cplus.logger.* - use DEBUG level to print information on file
log4cplus.rootLogger=WARN, MyFileAppender

#For MemoryCheck class I need to inspect all the details, and I want print information even to the console
log4cplus.logger.MemoryCheck=INFO, MyConsoleAppender

#For database stuff, I don't need to logging everything, it's enough printing only errors!
log4cplus.logger.DatabaseOperations=ERROR

###################################
########Define the Appenders#######
###################################

#MyConsoleAppender:
log4cplus.appender.MyConsoleAppender=log4cplus::ConsoleAppender
log4cplus.appender.MyConsoleAppender.layout=log4cplus::PatternLayout
log4cplus.appender.MyConsoleAppender.layout.ConversionPattern=[%-5p][%d] %m%n

#MyFileAppender
log4cplus.appender.MyFileAppender=log4cplus::RollingFileAppender
log4cplus.appender.MyFileAppender.File=logging.txt
log4cplus.appender.MyFileAppender.MaxFileSize=16MB
log4cplus.appender.MyFileAppender.MaxBackupIndex=1
log4cplus.appender.MyFileAppender.layout=log4cplus::PatternLayout
log4cplus.appender.MyFileAppender.layout.ConversionPattern=[%-5p][%D{%Y/%m/%d %H:%M:%S:%q}][%-l][%t] %m%n
【cpp代码】
#include <string>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/loggingmacros.h>

using namespace log4cplus;
using namespace std;

int main()
{
    log4cplus::initialize();
    log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.config"));
    log4cplus::Logger m_log = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("MemoryCheck"));

    try
    {
        int x = 8;
        double y = 8.88;
        string allocated_memory = "here";
        LOG4CPLUS_DEBUG(m_log, "x = " << x);
        LOG4CPLUS_DEBUG(m_log, "y = " << y);
        /* ... */
        LOG4CPLUS_INFO(m_log, "Allocated = " << allocated_memory);
    }
    catch (std::bad_alloc &e)
    {
        /* I KNOW HOW TO DEAL WITH THIS ERROR!! */
        /* ...code that handle the error is here... */
        LOG4CPLUS_ERROR(m_log, e.what());
    }
    catch (std::exception &e)
    {
        /* I KNOW HOW TO DEAL WITH THIS ERROR!! */
        /* ...code that handle the error is here... */
        LOG4CPLUS_ERROR(m_log, e.what());
    }
    catch (...)
    {
        /* I DON'T KNOW HOW MANAGE THE ERROR!! */
        LOG4CPLUS_FATAL(m_log, "unexpected error...use gdb core dump");
        exit(-1);
    }

    int memory_remaining = 122;
    if (memory_remaining < 123)
    {
        LOG4CPLUS_WARN(m_log, "LOW MEMORY!!");
    }

    return 0;
}