本文记录 从log4c 编译,配置log4c配置文件,编写helloword 整个过程。 在写这些的时候,我也是第一次接触和使用。希望对你们有帮助
我是在mac上进行编译,测试。其它环境应该大同小异
操作系统: OS X 10.9.4 (xcode 5)
log4c version: log4c-1.2.4
官网:http://log4c.sourceforge.net/
要适应从官网找东西,英语不是很好,记得刚开始入行时,上官网找下载连接都得找半天,但是不要怕,几次以后就习惯了。如果一次怕上官网的话,肯定学不好。没有什么资料比官网更权威的了。废话不多说:)
进入官网很快能找到:
on SourceForge:
The log4c package uses the GNU autotools compilation and installation framework. The following commands should build log4c on the supported platforms:
$ tar -zxvf log4c-1.2.0.tar.gz $ mkdir build; cd build $ $ make $ make install
在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是有配置文件的,叫log4crc。
log4c寻找配置文件的顺序如下:
1. 首先环境变量中寻找 ${LOG4C_RCPATH}/log4crc
2. 然后 ${HOME}/.logcrc
3. 最后在当前目录下查找 ./logcrc
<?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>这里在官网没有找到详细的配置文件用法,在网上看了点,总结下:
<category>,
<appender>
和
<layout> (不只这4中,在网上和看了点源码,至少还有<rollingpolicy> 策略的制定,例如日志文件超过多大,重新开启一个日志文件)
<nocleanup>
。 官网上说 <debug> 目前不用了 其它两个不是很理解,设置的时候按默认了。有需要再研究
<appender>
和
<layout> 这几个概念比较关键,按我理解:
<category>是日志本身。
合起来就是一个<category>(日志) 要指定appender(输出到哪里),appender要指定layout(输出的格式)。 log4c有定义几个基本的类型。/* 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() 里主要是加载配置文件,初始化变量 之类的事情。
#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; }
#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; }
#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
<?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/zlq_boom22/article/details/40594247