本文记录 从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>