一个Logger实例被配置后,将一直存在于程序中,在程序的任何地方都可通过实例名称获取到这个Logger,不用重新配置。
安装
linux
1- 解压: gzip -cd log4cplus-x.x.x.tar.gz | tar -xf -
2- 进入log4cplus根目录: cd log4cplus-x.x.x
3- 产生Makefile: ./configure —prefix=/where/to/install -enable-threads=no
如果需要指定安装路径可使用—prefix参数, 否则将缺省安装到/usr/local目录下。另外,如果需要单线程版本可通过参数-enable-threads=no指定, 否则默认将安装多线程版本。
对于HP-UNIX平台用户, 由于aCC编译器选项兼容性问题,请另外加入参数CXXFLAGS=”-AA -w”(单线程版本)或CXXFLAGS=”-AA –mt -w”(多线程版本)。
4- 创建: make
对于HP-UNIX用户,由于aCC编译器不包含-Wall选项来显示所有警告,创建时将导致无效的-W参数错误,请修改/log4cplus-x.x.x/src目录下的Makefile,将AM_CPPFLAGS = -Wall 行的-Wall选项删除或注释掉。
此外,某些HP-UNIX平台的套接字连接接受函数accept()第三个参数要求为int,而在socket-unix.cxx源文件153行实现中实际传入的是socklen_t类型,平台并不支持,也将导致编译错误。解决方法是将源代码该行中的传入参数强制转换为int*类型即可。
注意AIX和Linux平台目前并没有上述两处创建错误。
对于AIX平台用户请保证创建时使用的编译器是xlC而不是g++,否则将导致log4cplus脚本配置功能运行时产生段异常,生成core文件。有鉴于此,也请保证HP-UNIX用户尽量使用aCC编译器进行创建。
5- 创建/log4cplus/tests目录下的测试用例: make check
6- 安装: make install
安装成功后将在/usr/local目录或指定的目录下创建include和lib两个子目录及相应文件。其中include目录包含头文件,lib目录包含最终打包生成的静态和动态库。在动态连接log4cplus库时请使用-llog4cplus选项。
输出到控制台
【使用的基本步骤】
- 创建Appender对象
- 设置Appender的名称和输出格式(即Layout)
- 获得一个logger实例,并设置日志输出的等级
- 给Logger实例添加Appender
- 使用宏输出日志
【简单例子】输出到控制台
#include <log4cplus/log4cplus.h>int main(){//用Initializer类进行初始化log4cplus::Initializer initializer;//第1步:创建ConsoleAppenderlog4cplus::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实例添加ConsoleAppenderlogger.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使用PatternLayoutconsoleAppender->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和FileAppenderlogger.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步:创建SocketAppenderlog4cplus::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实例添加Appenderlogger.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 filelog4cplus.rootLogger=WARN, MyFileAppender#For MemoryCheck class I need to inspect all the details, and I want print information even to the consolelog4cplus.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::ConsoleAppenderlog4cplus.appender.MyConsoleAppender.layout=log4cplus::PatternLayoutlog4cplus.appender.MyConsoleAppender.layout.ConversionPattern=[%-5p][%d] %m%n#MyFileAppenderlog4cplus.appender.MyFileAppender=log4cplus::RollingFileAppenderlog4cplus.appender.MyFileAppender.File=logging.txtlog4cplus.appender.MyFileAppender.MaxFileSize=16MBlog4cplus.appender.MyFileAppender.MaxBackupIndex=1log4cplus.appender.MyFileAppender.layout=log4cplus::PatternLayoutlog4cplus.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;}
