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

时间:2021-02-26 16:43:06

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

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

[cpp]  view plain  copy
  1. #ifndef _LOG_H_  
  2. #define _LOG_H_  
  3.   
  4. #include <string.h>  
  5. #include <stdlib.h>  
  6.   
  7. #ifdef __cplusplus  
  8. extern "C"  
  9. {  
  10. #endif  
  11.   
  12. #include "log4c.h"  
  13.   
  14. #ifdef __cplusplus  
  15. }  
  16. #endif  
  17.   
  18. #define LOG_PRI_ERROR       LOG4C_PRIORITY_ERROR  
  19. #define LOG_PRI_WARN        LOG4C_PRIORITY_WARN  
  20. #define LOG_PRI_NOTICE      LOG4C_PRIORITY_NOTICE  
  21. #define LOG_PRI_DEBUG       LOG4C_PRIORITY_DEBUG  
  22. #define LOG_PRI_TRACE       LOG4C_PRIORITY_TRACE  
  23.   
  24. extern int log_open(const char *category);  
  25. extern void log_message(int priority ,const char* fmt, ...);  
  26. extern void log_trace(const char *file , int line , const char *func, const char *fmt ,...);  
  27. extern int log_close();  
  28.   
  29. #define LOG_ERROR(fmt , args...)    \  
  30.     log_message(LOG_PRI_ERROR, fmt, ##args)  
  31. #define LOG_WARN(fmt, args...)      \  
  32.     log_message(LOG_PRI_WARN, fmt , ##args)  
  33. #define LOG_NOTICE(fmt , args...)   \  
  34.     log_message(LOG_PRI_NOTICE, fmt , ##args)  
  35. #define LOG_DEBUG(fmt , args...)    \  
  36.     log_message(LOG_PRI_DEBUG, fmt , ##args)  
  37. #define LOG_TRACE(fmt,args...)      \  
  38.     log_trace(__FILE__ , __LINE__ , __FUNCTION__ , fmt ,## args)  
  39.   
  40.   
  41. #endif  


//log.c
[cpp]  view plain  copy
  1. #include <log4c.h>  
  2. #include <assert.h>  
  3. #include "log.h"  
  4.   
  5.   
  6. static log4c_category_t *log_category = NULL;  
  7.   
  8. int log_open(const char *category)  
  9. {  
  10.     if (log4c_init() == 1)  
  11.     {  
  12.         return -1;  
  13.     }  
  14.     log_category = log4c_category_get(category);  
  15.     return 0 ;  
  16. }  
  17.   
  18. void log_message(int priority , const char *fmt , ...)  
  19. {  
  20.     va_list ap;  
  21.       
  22.     assert(log_category != NULL);  
  23.   
  24.     va_start(ap, fmt);  
  25.     log4c_category_vlog(log_category , priority , fmt , ap);  
  26.     va_end(ap);  
  27. }  
  28.   
  29. void log_trace(const char *file, int line, const char *fun,   
  30.             const char *fmt , ...)  
  31. {  
  32.     char new_fmt[2048];  
  33.     const char *head_fmt = "[file:%s, line:%d, function:%s]";   
  34.     va_list ap;  
  35.     int n;  
  36.       
  37.     assert(log_category != NULL);  
  38.     n = sprintf(new_fmt, head_fmt , file , line , fun);  
  39.     strcat(new_fmt + n , fmt);  
  40.   
  41.     va_start(ap , fmt);  
  42.     log4c_category_vlog(log_category , LOG4C_PRIORITY_TRACE, new_fmt , ap);  
  43.     va_end(ap);  
  44. }  
  45.   
  46.   
  47. int log_close()  
  48. {  
  49.     return (log4c_fini());  
  50. }  

//test-log.c

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include "log.h"  
  3.   
  4. int main(void)  
  5. {  
  6.     log_open("<span style="color: rgb(51, 51, 51); line-height: 20px;">mycat</span>");  
  7.     LOG_TRACE("trace");  
  8.     LOG_ERROR("error");  
  9.     LOG_WARN("warn");  
  10.     LOG_NOTICE("notice");  
  11.     LOG_DEBUG("hello log4c!");  
  12.     log_close();  
  13.     return 0;  
  14. }  

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

[html]  view plain  copy
  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2. <!DOCTYPE log4c SYSTEM "">  
  3.   
  4. <log4c version="1.2.1">  
  5.   
  6.         <config>  
  7.                 <bufsize>0</bufsize>  
  8.                 <debug level="2"/>  
  9.                 <nocleanup>0</nocleanup>  
  10.                 <reread>1</reread>  
  11.         </config>  
  12.   
  13.         <!-- root category ========================================= -->  
  14.         <category name="root" priority="notice"/>  
  15.         <category name="mycat" priority="debug" appender="stdout"/>  
  16.   
  17.         <!-- default appenders ===================================== -->  
  18.         <appender name="stdout" type="stream" layout="basic"/>  
  19.         <appender name="stderr" type="stream" layout="dated"/>  
  20.         <appender name="syslog" type="syslog" layout="basic"/>  
  21.   
  22.         <!-- default layouts ======================================= -->  
  23.         <layout name="basic" type="basic"/>  
  24.         <layout name="dated" type="dated"/>  
  25.           
  26. </log4c>  



编译命令:

[python]  view plain  copy
  1. 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.

如果有什么问题,可以一起讨论下。若有什么错误,请各位指出。谢谢!