log4cxx使用心得

  • 简介

    apache出品必属精品。正宗c++日志库,与log4j一脉相承。

    http://logging.apache.org/log4cxx/index.html

  • 下载、编译、安装

    打算安装到${HOME}/libs目录下:

    cd ~/libs
    wget http://mirror.bjtu.edu.cn/apache//apr/apr-1.4.4.tar.bz2
    tar xjvf apr-1.4.4.tar.bz2
    cd apr-1.4.4
    ./configure --prefix=${HOME}/libs && make && make install
    cd ..
    wget http://mirror.bjtu.edu.cn/apache//apr/apr-util-1.3.11.tar.bz2
    tar xjvf apr-util-1.3.11.tar.bz2
    cd apr-util-1.3.11
    ./configure --prefix=${HOME}/libs --with-apr=${HOME}/libs && make && make install
    cd ..
    wget http://apache.etoak.com//logging/log4cxx/0.10.0/apache-log4cxx-0.10.0.tar.gz
    tar xzvf apache-log4cxx-0.10.0.tar.gz
    cd apache-log4cxx-0.10.0
    ./configure --with-charset=utf-8 --prefix=${HOME}/libs --with-apr=${HOME}/libs --with-apr-util=${HOME}/libs && make && make install
    
  • 使用例子

    hello.cpp

    #include "log4cxx/logger.h"
    #include "log4cxx/propertyconfigurator.h"
    
    static log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("hello"));
    
    int main(int argc, char *argv[])
    {
      log4cxx::PropertyConfigurator::configure("./log4cxx_hello.properties");
      LOG4CXX_INFO(logger, "你好,log4cxx!");
      return 0;
    }
    

    log4cxx_hello.properties

    log4j.rootLogger=debug, R
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    
    # Pattern to output the caller's file name and line number.
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=./hello.log
    
    log4j.appender.R.MaxFileSize=100KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=10
    
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%5p %c [%t] (%F:%L) - %m%n
    

    编译:

    g++ -o hello hello.cpp -I${HOME}/libs/include ${HOME}/libs/lib/liblog4cxx.a ${HOME}/libs/lib/libaprutil-1.a ${HOME}/libs/lib/libapr-1.a  -lexpat -lpthread
    
  • 注意事项

    由于一个日志文件写满后会重命名所有已有的日志文件,配置过大MaxBackupIndex的会有性能问题,因此log4cxx编译时限制了它的大小(大概十多个)以避免配置的MaxBackupIndex过大,如果要设置更大一点的MaxFileSize来保存更多日志,需要在编译前进行修改。

    参考:http://objectmix.com/apache/684503-urgent-log4cxx-large-window-sizes-not-allowed.html

  • 使用技巧
    • 决定配置文件的格式(xml,property)。以使用相应的配置器(Configurator)装入配置文件。

      xml虽较property格式繁锁,支持的配置面更全,而property格式的配置文件使用更简单,容易在网上找到现成的配置文件。

    • logger命名

      logger名称反映了软件模块,如果有代表软件模块的类,则在类中包含以该类类名命名的logger对象,该模块功能相关代码通过该logger进行日志记录。 另外可将logger对象作为全局变量,方便使用,特别是当软件模块较松散,并无对应的封装类时。

    • 在代码中适当地放置日志代码。引用适当的日志对象,对日志进行适当分级。
    • 余下的工作就是修改配置文件,对日志进行控制了。

  使用配置文件的好处就是可以方便地配置日志而不需要修改源代码,可以在配置文件中方便配置日志过滤、格式、日志目的地。

  • 体验

 之前产品中用到的是log4cplus,但是常常有写日志崩溃的情况出现,使用log4cxx正是用于解决该崩溃。