找了多篇文章,发现都讲的不怎么简明。自己摸索了下,记录如下:

Log4c中有三个重要的概念, Category, Appender, Layout。

Category用于区分不同的Logger, 其实它就是个logger。在一个程序中我们可以通过Category来指定很多的Logger,用于不同的目的。
Appdender用于描述输出流,通过为Category来指定一个Appdender,可以决定将log信息来输出到什么地方去,比如stdout, stderr, 文件, 或者是socket等等

Layout用于指定日志信息的格式,通过为Appender来指定一个Layout,可以决定log信息以何种格式来输出,比如是否有带有时间戳, 是否包含文件位置信息等,以及他们在一条log信息中的输出格式的等。

转载请注明出处:http://blog.csdn.net/fdl19881/article/details/8192363

例子:

系统:ubuntu12.10 .

准备:

安装log4c库, sudo apt-get install liblog4c-dev liblog4c-doc

别的系统请百度/GOOGLE找相关编译安装当。log4c官网:http://log4c.sourceforge.net/index.html

文件:

log.h log.c 自己将log4c重新封装的函数

test-log.c 测试用的主函数

log4crc 配置文件(xml,照着写就行)

//log.h

#ifndef _LOG_H_
#define _LOG_H_#include <string.h>
#include <stdlib.h>#ifdef __cplusplus
extern "C"
{
#endif#include "log4c.h"#ifdef __cplusplus
}
#endif#define LOG_PRI_ERROR         LOG4C_PRIORITY_ERROR
#define LOG_PRI_WARN        LOG4C_PRIORITY_WARN
#define LOG_PRI_NOTICE      LOG4C_PRIORITY_NOTICE
#define LOG_PRI_DEBUG       LOG4C_PRIORITY_DEBUG
#define LOG_PRI_TRACE       LOG4C_PRIORITY_TRACEextern int log_open(const char *category);
extern void log_message(int priority ,const char* fmt, ...);
extern void log_trace(const char *file , int line , const char *func, const char *fmt ,...);
extern int log_close();#define LOG_ERROR(fmt , args...) \log_message(LOG_PRI_ERROR, fmt, ##args)
#define LOG_WARN(fmt, args...)      \log_message(LOG_PRI_WARN, fmt , ##args)
#define LOG_NOTICE(fmt , args...)   \log_message(LOG_PRI_NOTICE, fmt , ##args)
#define LOG_DEBUG(fmt , args...)    \log_message(LOG_PRI_DEBUG, fmt , ##args)
#define LOG_TRACE(fmt,args...)      \log_trace(__FILE__ , __LINE__ , __FUNCTION__ , fmt ,## args)#endif

//log.c

#include <log4c.h>
#include <assert.h>
#include "log.h"static log4c_category_t *log_category = NULL;int log_open(const char *category)
{if (log4c_init() == 1){return -1;}log_category = log4c_category_get(category);return 0 ;
}void log_message(int priority , const char *fmt , ...)
{va_list ap;assert(log_category != NULL);va_start(ap, fmt);log4c_category_vlog(log_category , priority , fmt , ap);va_end(ap);
}void log_trace(const char *file, int line, const char *fun, const char *fmt , ...)
{char new_fmt[2048];const char *head_fmt = "[file:%s, line:%d, function:%s]"; va_list ap;int n;assert(log_category != NULL);n = sprintf(new_fmt, head_fmt , file , line , fun);strcat(new_fmt + n , fmt);va_start(ap , fmt);log4c_category_vlog(log_category , LOG4C_PRIORITY_TRACE, new_fmt , ap);va_end(ap);
}int log_close()
{return (log4c_fini());
}

//test-log.c

#include <stdio.h>
#include "log.h"int main(void)
{log_open("<span style="color: rgb(51, 51, 51); line-height: 20px;">mycat</span>");LOG_TRACE("trace");LOG_ERROR("error");LOG_WARN("warn");LOG_NOTICE("notice");LOG_DEBUG("hello log4c!");log_close();return 0;
}

//配置文件,默认名为log4crc

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM ""><log4c version="1.2.1"><config><bufsize>0</bufsize><debug level="2"/><nocleanup>0</nocleanup><reread>1</reread></config><!-- root category ========================================= --><category name="root" priority="notice"/><category name="mycat" priority="debug" appender="stdout"/><!-- 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>

编译命令:

gcc test-log.c log.c -o test-log -llog4c

运行效果

./test-log

[stdout] TRACE    mycat - [file:test-log.c, line:7, function:main]trace
[stdout] ERROR    mycat - error
[stdout] WARN     mycat - warn
[stdout] NOTICE   mycat - notice
[stdout] DEBUG    mycat - hello log4c!

讲解:

关于log.h ,log.c封装的内容大家可以看看,用到了可变参数宏,可变参数这些。百度一下,就有很多人讲解了。这里就不说了。

log.h与log.c里面用法也很简单

log_open("category_name"); //category_name一定得是log4crc里面已经定义的category.

关于配置文件log4crc

更复杂的配置参见:http://xueqi.iteye.com/blog/1570013

配置文件的搜索是由LOG4C_RCPATH环境变量决定。搜索的配置文件名为log4crc(不知道能否改变,没研究过)

配置文件中category的priority不知道是什么意思,,反正好像没什么用。不管设置成什么,好像都不影响。

环境变量:

  • LOG4C_RCPATH holds the path to the main log4crc configuration file #环境变量若未设置,则在工作目录(一般为运行目录)搜索log4crc配置文件. 如果设置了此变量,则所以用log4c库的程序都会使用此路径下的log4c配置文件(可根据category区分).
  • LOG4C_PRIORITY holds the "root" category priority #改变root的priority,,
  • LOG4C_APPENDER holds the "root" category appender #改变root的appender,,因为root默认没设置appender.
如果有什么问题,可以一起讨论下。若有什么错误,请各位指出。谢谢!

log4c日志库的用法,再封装及其完整例子相关推荐

  1. spdlog 日志库学习,简易封装

    spdlog wiki:https://github.com/gabime/spdlog/wiki 别人的学习笔记:https://www.cnblogs.com/oucsheep/p/8426548 ...

  2. 【OCP-052】052考试题库一变再变,完整题库收集整理-第15题

    15.Which two are true about space management in tablespaces? A) Locally managed tablespaces have eit ...

  3. spdlog日志库的封装使用

    文章目录 前言 spdlog的基本使用 spdlog日志库的封装 前言 编码过程中,日志是必要的一个组件,我们选择使用哪个日志库呢? 参考:15 best C++ Logging libraries ...

  4. 服务器开发27:log4c充当服务器跨平台日志库(cmake跨平台编译,配置介绍及代码封装)

    文章目录 一.跨平台编译 1)编译准备 (1)expat编译 2)原生linux编译.安装 3)cmake跨平台编译 二.log4c配置笔记 1)与log4cpp\log4cxx的比较 2)log4c ...

  5. go zap日志库的使用,以及封装。

    go zap日志库使用说明 及 封装 1 zap日志的基本使用 1.0 zap简介 1.1 日志介绍 1.2 为什么选择zap日志 1.3 zap的安装 1.4 创建实例-两种类型 1.4.1 Log ...

  6. 日志库EasyLogging++学习系列(3)—— 配置功能

    在前面的文章 <日志库Easylogging++学习系列(1) -- 简要介绍 >中,我们已经初步见识到了 Easylogging++ 日志库强大的配置功能.那么配置文件中各个字段的意义是 ...

  7. go日志库log/zap/logrus

    一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例如INFO,DEBUG,ERR ...

  8. 【C/C++开源库】单片机/嵌入式中的C语言日志库

    日志系统在系统开发和调整过程中的重要性,大家应该都清楚,特别是项目出问题之后,却没有日志可以帮忙定位问题,就非常令人痛苦. 因为我们不可能一直通过调试器去单步调试程序,所以设备的运行日志显得尤为重要. ...

  9. 【CC++开源库】单片机嵌入式中的C语言日志库

    日志系统在系统开发和调整过程中的重要性,大家应该都清楚,特别是项目出问题之后,却没有日志可以帮忙定位问题,就非常令人痛苦. 因为我们不可能一直通过调试器去单步调试程序,所以设备的运行日志显得尤为重要. ...

最新文章

  1. Codeforces 815 B Karen and Test 杨辉三角 组合数学
  2. PostgreSQL创建数据库时报错:ERROR: source database template1 is being accessed by other users
  3. Android LiveData组件详解以及LiveDataBus
  4. PHP获取当前页面URL
  5. java类名与文件名_为什么Java文件名必须与公共类名相同?
  6. ssh 免密_Linux下配置SSH免密通信 “sshkeygen”的基本用法
  7. PKI与证书服务应用
  8. 【word使用技巧】删掉某一行参考
  9. vue中使用axios发送请求(二)
  10. Android源码下载编译(高通)
  11. python十六进制转为二进制_Python进制转换(二进制、十进制和十六进制)
  12. 考察数据结构——第三部分:二叉树和BSTs[译]
  13. 成都盛铭轩:商家怎么装修设计
  14. CSS(七)元素过渡、变化、动画
  15. 选修课程期末作业 : 大象基金交易信息系统分析与设计报告
  16. oracle-29913,Oracle RAC expdp 错误一例 ORA-29913: error in executing ODCIEXTTABLEPOPULATE callout...
  17. native-JavaScript通信流程( 基于最新的 react native版本 )
  18. 如何做一个真正的男人
  19. python自己的手稿四之互动沟通
  20. Java虚拟机这一块 —— 深入理解java虚拟机(jvm)

热门文章

  1. 博德之门2增强版存档_博德之门2:增强版 存档位置及修改方法
  2. ucl计算机教授汪军,AI特辑#2:对话UCL汪军教授,机器有意识吗
  3. 机器学习流程错误分析
  4. Oracle APEX 系列文章8:如何从 APEX 5.1.4 升级到最新的 APEX 18.1
  5. window中文输入英文符号
  6. 【codeforces】【Round#523D】TV shows
  7. 利用云函数搭建简易的代理池
  8. 如何通过流失预测模型实现App用户增长?
  9. cron每半个小时执行一次_如何用crontab设定程序每半个小时执行一次
  10. runtime(零) Objc 中类和对象的本质