ubuntu下安装与使用Log4cpp

来源:互联网 发布:免费开源的cms 编辑:程序博客网 时间:2024/06/03 05:06
ubuntu下安装与使用Log4cpp

1、下载版本:log4cpp-1.1rc3.tar.gz,  该版本中没有1.0版本的那些bug,不需修改,下载地址:http://sourceforge.net/projects/log4cpp/

2、解压下载的压缩文件:log4cpp-1.1rc3.tar.gz,可以使用命令行,或者右键压缩包,在弹出菜单项中选择“解压至此处”

3、解压后的文件夹名为log4cpp,在终端(快捷键ctrl+alt+t)中,cd到该文件夹下,注意需要root权限。

4、运行configure
#./configure --with-pthreads

5、在终端中依次输入如下命令,即可完成安装,安装完成后,log4cpp so库在/usr/local/lib下,头文件在/usr/local/include目录下

#./configure
#make
#make install

6、添加环境变量
#gedit /etc/profile.d/log4cpp.sh
在文件中添加如下文字(注意不要少了冒号):
LD_LIBRARY_PATH=:$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH

7、保存好文件后,修改该文件可执行权限,在终端中输入的命令如下:
#chmod a+x /etc/profile.d/log4cpp.sh


8、使用命令ldconfig -v后上述配置方可生效,在终端(ctrl+alt+t)中直接输入ldconfig -v,注意需要root权限(在终端中输入sudo su,然后回车输入密码),
desktop:/usr/local/lib# ldconfig -v
否则在程序运行后会出现如下找不到动态库的问题:
./test_main: error while loading shared libraries: liblog4cpp.so.5: cannot open shared object file: No such file or directory

9、编译程序的指令为:
g++ test_main.cpp -o test_main -llog4cpp -lpthread
其中:test_main.cpp为上述源文件,test_main为目标文件,-llog4cpp告诉编译器使用了log4cpp的so库,如果刚才 log4cpp安装时使用默认路径,则该动态库在/user/local/lib下,文件名为liblog4cpp.so,-lpthread告诉编译器 在liblog4cpp中使用了线程。

10、不使用配置文件的测试代码(下面的代码摘自网络):

//test_main.cpp
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/BasicLayout.hh>

int main()
{
  log4cpp::Layout* layout =  new log4cpp::BasicLayout();
   // 2. 初始化一个appender 对象
  log4cpp::Appender* appender = new log4cpp::FileAppender("FileAppender","./test_log4cpp1.log");
    // 3. 把layout对象附着在appender对象上
  appender->setLayout(layout);
  // 4. 实例化一个category对象
  log4cpp::Category& warn_log = log4cpp::Category::getInstance("mywarn");
  // 5. 设置additivity为false,替换已有的appender
  warn_log.setAdditivity(false);
  // 5. 把appender对象附到category上
  warn_log.setAppender(appender);
  // 6. 设置category的优先级,低于此优先级的日志不被记录
  warn_log.setPriority(log4cpp::Priority::WARN);
  // 记录一些日志
  warn_log.info("Program info which cannot be wirten");
  warn_log.debug("This debug message will fail to write");
  warn_log.alert("Alert info");
  // 其他记录日志方式
  warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning");
  log4cpp::Priority::PriorityLevel priority;
  bool this_is_critical = true;
  if(this_is_critical)
       priority = log4cpp::Priority::CRIT;
  else
       priority = log4cpp::Priority::DEBUG;
  warn_log.log(priority,"Importance depends on context");
        
  warn_log.critStream() << "This will show up << as " << 1 << " critical message"<< log4cpp::Priority::ERROR;
  // clean up and flush all appenders
  log4cpp::Category::shutdown();
  return 0;
}



11、使用配置文件,

(1)配置文件log4cpp.conf内容如下(摘自http://www.ibm.com/developerworks/cn/linux/l-log4cpp/index.html):
############################## log4cpp.conf ########################################################
# a simple test config
#定义了3个category sub1, sub2, sub1.sub2
log4j.rootCategory=DEBUG, rootAppender
log4j.category.sub1=,A1
log4j.category.sub2=INFO
log4j.category.sub1.sub2=ERROR, A2
# 设置sub1.sub2 的additivity属性
log4j.additivity.sub1.sub2=false
#定义rootAppender类型和layout属性
log4j.appender.rootAppender=org.apache.log4j.ConsoleAppender
log4j.appender.rootAppender.layout=org.apache.log4j.BasicLayout
#定义A1的属性
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.fileName=A1.log
log4j.appender.A1.layout=org.apache.log4j.SimpleLayout
#定义A2的属性
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=The message '%m' at time %d%n
##################################################################################################
(2)测试代码如下:
###############################test_usecfg.cpp#######################################################
#include <log4cpp/PropertyConfigurator.hh>
#include <log4cpp/Category.hh>
int main() {
    // 1 读取解析配置文件
    // 读取出错, 完全可以忽略,可以定义一个缺省策略或者使用系统缺省策略
    // BasicLayout输出所有优先级日志到ConsoleAppender
    try
    {
        log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
    }
    catch (log4cpp::ConfigureFailure& f)
    {
        std::cout << "Configure Problem: " << f.what() << std::endl;
        return -1;
    }
    //2    实例化category对象
    //    这些对象即使配置文件没有定义也可以使用,不过其属性继承其父category
    //    通常使用引用可能不太方便,可以使用指针,以后做指针使用
    log4cpp::Category& root = log4cpp::Category::getRoot();
    log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
    log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub2"));
    log4cpp::Category& sub3 = log4cpp::Category::getInstance(std::string("sub3"));
    log4cpp::Category& sub4 = log4cpp::Category::getInstance(std::string("sub4"));
    //    正常使用这些category对象进行日志处理。
    root.fatal("root's log");
    //    sub1 has appender A1 and rootappender. since the additivity property is set true by default
    sub1.info("sub1's log");
    //    sub2 has appender A2 appender. since the additivity property is set to false
    sub2.alert("sub2's log");
    //    sub3 only has A3 appender. since the additivity property is set to false
    sub3.debug("sub3's log");
    sub3.alert("sub3's log");
    //    sub4 can not be found in the config file, so the root category's appender and layout are used
    sub4.warn("sub4's log");
    return 0;
}

##########################################################################################
0 0
原创粉丝点击