首页 > 代码库 > 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 总结