使用
输出到控制台¶
【使用的基本步骤】
- 创建Appender对象
- 设置Appender的名称和输出格式(即Layout)
- 获得一个logger实例,并设置日志输出的等级
- 给Logger实例添加Appender
- 使用宏输出日志
【简单例子】输出到控制台
#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
#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;
}