首页 > 代码库 > log4c 总结
log4c 总结
本文记录 从log4c 编译,配置log4c配置文件,编写helloword 整个过程。 在写这些的时候,我也是第一次接触和使用。希望对你们有帮助
我是在mac上进行编译,测试。其它环境应该大同小异
操作系统: OS X 10.9.4 (xcode 5)
log4c version: log4c-1.2.4
第一步:下载源码
官网:http://log4c.sourceforge.net/
要适应从官网找东西,英语不是很好,记得刚开始入行时,上官网找下载连接都得找半天,但是不要怕,几次以后就习惯了。如果一次怕上官网的话,肯定学不好。没有什么资料比官网更权威的了。废话不多说:)
进入官网很快能找到:
Installation
Building from source tarballs
on SourceForge:
- log4c-1.2.4.tar.gz
The log4c package uses the GNU autotools compilation and installation framework. The following commands should build log4c on the supported platforms:
$ gzip -dc log4c-1.2.4.tar.gz | tar tvf -
$ cd log4c-1.2.4/
$ ./configure --prefix=/path/of/installation
$ make
$ make install
这里提供下载tar包,并且给出了怎么编译安装。我们先把它下载下来,解压。
cd log4c-1.2.4
先不急着编译,我们先来看下README 这是很重要的一个环节,英语不好也没关系,里面一般不会太难阅读。看这种不建议从头看到尾,除非你很闲。扫描式阅读。很快你会发现下面这段:
$ tar -zxvf log4c-1.2.0.tar.gz $ mkdir build; cd build $ $ make $ make install
再往下看是教你生成文档,test程序之类的参数。有需求的可以看。我就想生成doc文档 在后面的configure的时候添加了 --enable-doc 参数
在log4c-1.2.4同级目录下创建一个build目录,并进入
mkdir build; cd build
我想生成文档看看,这是我输入的命令:
../log4c-1.2.0/configure --prefix=/usr/local/log4c --enable-doc这里log4c生成文档需要doxygen,这个在官网页面上有写。 所以需要安装doxygen。
configure 后 就是 惯例了
$ make $ make install
第二步: 学习使用log4c(配置文件)
还是看官网。原文我就不贴了。里面讲到,log4c是有配置文件的,叫log4crc。
log4c寻找配置文件的顺序如下:
1. 首先环境变量中寻找 ${LOG4C_RCPATH}/log4crc
2. 然后 ${HOME}/.logcrc
3. 最后在当前目录下查找 ./logcrc
配置文件是一个xml文件,官网贴出的示例:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE log4c SYSTEM ""> <log4c> <config> <bufsize>0</bufsize> <debug level="0"/> <nocleanup>0</nocleanup> </config> <!-- root category ========================================= --> <category name="root" priority="notice"/> <!-- default appenders ===================================== --> <appender name="stdout" type="stream" layout="basic"/> <appender name="stderr" type="stream" layout="dated"/> <appender name="syslog" type="syslog" layout="basic"/> <!-- default layouts ======================================= --> <layout name="basic" type="basic"/> <layout name="dated" type="dated"/> </log4c>这里在官网没有找到详细的配置文件用法,在网上看了点,总结下:
根节点是<log4c>,可以有一个属性和4类子节点
属性: version 例如 <log4c version="1.2.4">
4种子节点: <config>,
<category>,
<appender> 和
<layout> (不只这4中,在网上和看了点源码,至少还有<rollingpolicy> 策略的制定,例如日志文件超过多大,重新开启一个日志文件) <config> 下可以有 <bufsize>,
<nocleanup> 。 官网上说 <debug> 目前不用了 其它两个不是很理解,设置的时候按默认了。有需要再研究<category>,
<appender> 和
<layout> 这几个概念比较关键,按我理解:<layout> 就是输出日志的格式,<appender> 是描述输出到哪里,
<category>是日志本身。 合起来就是一个<category>(日志) 要指定appender(输出到哪里),appender要指定layout(输出的格式)。 log4c有定义几个基本的类型。例如 layout 定义了 dated (包含时间), basic (最基本的日志信息)
appender stdout (标准输出) , stderr ,
配置文件就先总结这么多,刚接触自己也不是很懂,文档中貌似提到的不多。
第三步:程序里使用
使用很简单,就四个步骤
/* log4c init */ log4c_init(); /* get category */ log4c_category_t* mycat = log4c_category_get("zhenglq"); /* out log */ log4c_category_log(mycat, LOG4C_PRIORITY_DEBUG,"Hello World!"); log4c_fini();log4c_init() 里主要是加载配置文件,初始化变量 之类的事情。
log4c_category_get 函数 用来加载配置文件中规定的 category 也就是日志对象。 这里的参数要和配置文件对应上。详情看后面的例子
log4c_category_log 函数 用来输出日志
log4c_fini 用来退出,释放之类的工作
第四步:例子
有了上面做基础,写个例子吧
贴出关键的函数。这里用单件模式封装了一个对象。 整个工程提供下载 http://download.csdn.net/detail/zlq_boom22/8102437
main.cpp
#include "classA.h" #include "classB.h" //#include <log4c/init.h> //#include <log4c/category.h> #include "log.h" int main(int argc,char** argv) { MyLog::get_instance()->init("zhenglq"); ClassA ca; ClassB cb; ca.printStr(); cb.printStr(); /* log4c init */ // log4c_init(); /* get category */ // log4c_category_t* mycat = log4c_category_get("aiwujie"); /* out log */ // log4c_category_log(mycat, LOG4C_PRIORITY_DEBUG,"Hello World!"); // log4c_fini(); LOG_DEBUG("hello log4c!"); return 0; }
log.cpp
#include <stdio.h> #include "log.h" MyLog * MyLog::_instance = NULL; MyLog::MyLog() { } MyLog::~MyLog() { if (log4c_fini() != 0) printf("log4c fini error!\n"); } void MyLog::init(const char * str) { if (log4c_init() != 0) { printf("log4c init error!\n"); return; } mycat = log4c_category_get(str); } MyLog * MyLog::get_instance() { if (_instance == NULL) { _instance = new MyLog; } else { } return _instance; }
log.h
#ifndef LOG_H #define LOG_H #include <log4c/init.h> #include <log4c/category.h> class MyLog { public: void init(const char * str); static MyLog * get_instance(); log4c_category_t * mycat; private: MyLog(); ~MyLog(); private: static MyLog * _instance; }; #define LOG_DEBUG(msg, args...) { const log4c_location_info_t locinfo = LOG4C_LOCATION_INFO_INITIALIZER(NULL); log4c_category_log_locinfo(MyLog::get_instance()->mycat, &locinfo, LOG4C_PRIORITY_DEBUG, msg, ##args); } #define LOG_ERROR(msg, args...) { const log4c_location_info_t locinfo = LOG4C_LOCATION_INFO_INITIALIZER(NULL); log4c_category_log_locinfo(MyLog::get_instance()->mycat, &locinfo, LOG4C_PRIORITY_ERROR, msg, ##args); } #define LOG_TRACE(msg, args...) { const log4c_location_info_t locinfo = LOG4C_LOCATION_INFO_INITIALIZER(NULL); log4c_category_log_locinfo(MyLog::get_instance()->mycat, &locinfo, LOG4C_PRIORITY_TRACE, msg, ##args); } #endif
log4crc
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE log4c SYSTEM ""> <log4c> <config> <bufsize>0</bufsize> <debug level="0"/> <nocleanup>0</nocleanup> </config> <category name="root" priority="notice"/> <appender name="log4.log" type="stream" layout="dated" logdir="." prefix="testLog"/> <layout name="dated" type="dated"/> <category name="aiwujie" priority="debug" appender="log4.log"/> </log4c>
参考连接:
http://blog.csdn.net/sky_qing/article/details/7208645
http://www.cnblogs.com/jyli/archive/2010/02/11/1660606.html
log4c 总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。