找了多篇文章,发现都讲的不怎么简明。自己摸索了下,记录如下:
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_TRACE extern 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 > < category name = "root" priority = "notice" /> < category name = "mycat" priority = "debug" appender = "stdout" /> < appender name = "stdout" type = "stream" layout = "basic" /> < appender name = "stderr" type = "stream" layout = "dated" /> < appender name = "syslog" type = "syslog" layout = "basic" /> < 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.
如果有什么问题,可以一起讨论下。若有什么错误,请各位指出。谢谢!