一个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选项。

输出到控制台

【使用的基本步骤】

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

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

  1. #include <log4cplus/log4cplus.h>
  2. int main()
  3. {
  4. //用Initializer类进行初始化
  5. log4cplus::Initializer initializer;
  6. //第1步:创建ConsoleAppender
  7. log4cplus::SharedAppenderPtr appender(new log4cplus::ConsoleAppender());
  8. //第2步:设置Appender的名称和输出格式(SimpleLayout)
  9. appender->setName(LOG4CPLUS_TEXT("console"));
  10. appender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));
  11. //第3步:获得一个Logger实例,并设置其日志输出等级阈值
  12. log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
  13. logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);
  14. //第4步:为Logger实例添加ConsoleAppender
  15. logger.addAppender(appender);
  16. //第5步:使用宏将日志输出
  17. LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
  18. return 0;
  19. }

输出到控制台和文件

  1. #include <log4cplus/log4cplus.h>
  2. int main()
  3. {
  4. //用Initializer类进行初始化
  5. log4cplus::Initializer initializer;
  6. //第1步:创建ConsoleAppender和FileAppender(参数app表示内容追加到文件)
  7. log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender);
  8. log4cplus::SharedAppenderPtr fileAppender(new log4cplus::FileAppender(
  9. LOG4CPLUS_TEXT("log.txt"),
  10. std::ios_base::app
  11. )
  12. );
  13. //第2步:设置Appender的名称和输出格式
  14. //ConsoleAppender使用SimpleLayout
  15. //FileAppender使用PatternLayout
  16. consoleAppender->setName(LOG4CPLUS_TEXT("console"));
  17. consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout()));
  18. fileAppender->setName(LOG4CPLUS_TEXT("file"));
  19. log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n");
  20. fileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern)));
  21. //第3步:获得一个Logger实例,并设置其日志输出等级阈值
  22. log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
  23. logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);
  24. //第4步:为Logger实例添加ConsoleAppender和FileAppender
  25. logger.addAppender(consoleAppender);
  26. logger.addAppender(fileAppender);
  27. //第5步:使用宏将日志输出
  28. LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
  29. return 0;
  30. }

输出到日志服务器

  1. #include <log4cplus/log4cplus.h>
  2. int main()
  3. {
  4. //用Initializer类进行初始化
  5. log4cplus::Initializer initializer;
  6. //第1步:创建SocketAppender
  7. log4cplus::SharedAppenderPtr appender(new log4cplus::SocketAppender(
  8. LOG4CPLUS_TEXT("localhost"),
  9. 32015, LOG4CPLUS_TEXT("test")));
  10. //第2步:设置Appender的名称,SocketAppender不需要设置输出格式
  11. appender->setName(LOG4CPLUS_TEXT("logserver"));
  12. //第3步:获得一个Logger实例,并设置其日志输出等级阈值
  13. log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
  14. logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);
  15. //第4步:为Logger实例添加Appender
  16. logger.addAppender(appender);
  17. //第5步:使用宏将日志输出
  18. LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
  19. return 0;
  20. }

使用配置文件

配置文件

  1. # 文件名:log4cplus.config
  2. ###################################
  3. ########Define log Levels##########
  4. ###################################
  5. # 告警级别由低到高排序: TRACE DEBUG INFO WARN ERROR FATAL
  6. #All classes - except those in log4cplus.logger.* - use DEBUG level to print information on file
  7. log4cplus.rootLogger=WARN, MyFileAppender
  8. #For MemoryCheck class I need to inspect all the details, and I want print information even to the console
  9. log4cplus.logger.MemoryCheck=INFO, MyConsoleAppender
  10. #For database stuff, I don't need to logging everything, it's enough printing only errors!
  11. log4cplus.logger.DatabaseOperations=ERROR
  12. ###################################
  13. ########Define the Appenders#######
  14. ###################################
  15. #MyConsoleAppender:
  16. log4cplus.appender.MyConsoleAppender=log4cplus::ConsoleAppender
  17. log4cplus.appender.MyConsoleAppender.layout=log4cplus::PatternLayout
  18. log4cplus.appender.MyConsoleAppender.layout.ConversionPattern=[%-5p][%d] %m%n
  19. #MyFileAppender
  20. log4cplus.appender.MyFileAppender=log4cplus::RollingFileAppender
  21. log4cplus.appender.MyFileAppender.File=logging.txt
  22. log4cplus.appender.MyFileAppender.MaxFileSize=16MB
  23. log4cplus.appender.MyFileAppender.MaxBackupIndex=1
  24. log4cplus.appender.MyFileAppender.layout=log4cplus::PatternLayout
  25. log4cplus.appender.MyFileAppender.layout.ConversionPattern=[%-5p][%D{%Y/%m/%d %H:%M:%S:%q}][%-l][%t] %m%n

【cpp代码】

  1. #include <string>
  2. #include <log4cplus/logger.h>
  3. #include <log4cplus/configurator.h>
  4. #include <log4cplus/loggingmacros.h>
  5. using namespace log4cplus;
  6. using namespace std;
  7. int main()
  8. {
  9. log4cplus::initialize();
  10. log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.config"));
  11. log4cplus::Logger m_log = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("MemoryCheck"));
  12. try
  13. {
  14. int x = 8;
  15. double y = 8.88;
  16. string allocated_memory = "here";
  17. LOG4CPLUS_DEBUG(m_log, "x = " << x);
  18. LOG4CPLUS_DEBUG(m_log, "y = " << y);
  19. /* ... */
  20. LOG4CPLUS_INFO(m_log, "Allocated = " << allocated_memory);
  21. }
  22. catch (std::bad_alloc &e)
  23. {
  24. /* I KNOW HOW TO DEAL WITH THIS ERROR!! */
  25. /* ...code that handle the error is here... */
  26. LOG4CPLUS_ERROR(m_log, e.what());
  27. }
  28. catch (std::exception &e)
  29. {
  30. /* I KNOW HOW TO DEAL WITH THIS ERROR!! */
  31. /* ...code that handle the error is here... */
  32. LOG4CPLUS_ERROR(m_log, e.what());
  33. }
  34. catch (...)
  35. {
  36. /* I DON'T KNOW HOW MANAGE THE ERROR!! */
  37. LOG4CPLUS_FATAL(m_log, "unexpected error...use gdb core dump");
  38. exit(-1);
  39. }
  40. int memory_remaining = 122;
  41. if (memory_remaining < 123)
  42. {
  43. LOG4CPLUS_WARN(m_log, "LOW MEMORY!!");
  44. }
  45. return 0;
  46. }