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

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

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>

        <!-- 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.

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

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
spdlog是一个快速、异步的C++日志,支持多线程和跨平台,具有简单易用的接口和高性能的日志记录能力。以下是spdlog的一些主要特点: 1. 快速:spdlog使用高效的缓冲区实现快速的日志记录,可以轻松处理高负载的日志记录场景。 2. 异步:spdlog支持异步日志记录,可以将日志写入缓冲区后立即返回,不会阻塞主线程。 3. 多线程:spdlog可以安全地在多个线程中使用,支持多个线程同时进行日志记录,且不需要额外的同步机制。 4. 跨平台:spdlog可以在多个平台上运行,包括Windows、Linux、OS X等。 5. 简单易用:spdlog提供简洁明了的API,可以轻松地实现日志记录功能。 以下是spdlog的使用示例: ```cpp #include "spdlog/spdlog.h" void log_example() { // 创建一个控制台日志记录器 auto console = spdlog::stdout_color_mt("console"); // 创建一个文件日志记录器 auto file = spdlog::basic_logger_mt("file_logger", "logs/mylogfile.txt"); // 设置日志记录级别 console->set_level(spdlog::level::info); file->set_level(spdlog::level::trace); // 记录日志 console->info("Hello, spdlog!"); file->trace("This is a trace message."); } ``` 以上代码演示了如何创建一个控制台日志记录器和一个文件日志记录器,并设置不同的日志记录级别,最后分别记录了一条信息和一条跟踪信息。 更多关于spdlog的使用说明,请参考spdlog的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值