linux c日志功能实现

一般linux 下的c语音项目都会通过打印进行调试,简单临时的可能就使用printf函数进行凑合了,但是对于大一点的项目就不是很方便了,现在也有很多开源软件里面都有进行相应的日志功能的封装,不过那对于自己开发的项目调用就没那么简单了,所以基于此背景,写下自己的一点思路供大家参考,欢迎对不足的地方指出完善。

下面就把代码贴出来。

log.h

#ifndef _LOG_H
#define _LOG_H

#include <stdarg.h>
#include <syslog.h>

#define	MAX_LOG_LEN	1024

/* 添加了打印语句所在的文件、行号、函数信息 */
#define C_LOG(level, fmt, argc...) log_message(level, "[file:%s,line:%d,func:%s]" fmt, __FILE__,  __LINE__, __FUNCTION__, ##argc) 

#endif

log.c

#include <stdio.h>
#include <time.h>
#include "log.h"

static const char *log_level_str[] = {
	[LOG_EMERG] = "EMERG",
	[LOG_ALERT] = "ALERT",
	[LOG_CRIT] = "CRIT",
	[LOG_ERR] = "ERR",
	[LOG_WARNING] = "WARNING",
	[LOG_NOTICE] = "NOTICE",
	[LOG_INFO] = "INFO",
	[LOG_DEBUG] = "DEBUG",
};

static void get_current_time(char *buf, int len)
{
	time_t timep;
	struct tm *p;
	
	time(&timep);
	p = gmtime(&timep);
	snprintf(buf, len - 1, "%d/%d/%d %d-%d-%d", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
}

static void vlog_message(const int level, const char* fmt, va_list args)
{
	char buf[MAX_LOG_LEN+1] = {0};
	char time[128] = {0};

	get_current_time(time, sizeof(time) - 1);
	vsnprintf(buf, sizeof(buf), fmt, args);
	/* 可以在这里组装需要的信息 */
	fprintf(stderr, "%s[%s]%s\n", time, log_level_str[level], buf);  /* 时间,级别,位置,日志内容 */
	/* cat /var/log/messages 进行日志查看 */
	syslog(level, "%s", buf);
}

void log_message(const int level, const char *fmt, ...)
{
	va_list args;

	va_start(args, fmt);
	vlog_message(level, fmt, args);
	va_end(args);
}
main..c

/*
 *
 * 说明:	日志模块调用测试使用,仅供参考。
 *			函数使用可以网上查询具体参数含义
 *
 */

#include "log.h"

int main(int argc, char **argv)
{
	/* 打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了 */
	openlog("APP", LOG_PID, 0); 

	/* 用来设置记录日志的优先级,即只记录指定优先级的日志消息 */
	setlogmask(LOG_UPTO(LOG_INFO));

	C_LOG(LOG_INFO, "ABC LOG_NOTICE");
	C_LOG(LOG_INFO, "ABC LOG_INFO");
	C_LOG(LOG_DEBUG, "ABC LOG_DEBUG");

	/* 关闭被用于与syslog守护进程通信的描述符 */
	closelog();

	return 0;
}

编译:gcc main.c  log.c -o main

运行:./main
2016/12/14 13-34-23[INFO][file:main.c,line:18,func:main]ABC LOG_NOTICE
2016/12/14 13-34-23[INFO][file:main.c,line:19,func:main]ABC LOG_INFO
2016/12/14 13-34-23[DEBUG][file:main.c,line:20,func:main]ABC LOG_DEBUG
查看结果:tail -f /var/log/messages
Dec 14 05:11:54 localhost NetworkManager[1971]: <info>   prefix 24 (255.255.255.0)
Dec 14 05:11:54 localhost NetworkManager[1971]: <info>   gateway 192.168.0.1
Dec 14 05:11:54 localhost NetworkManager[1971]: <info>   nameserver '222.246.129.80'
Dec 14 05:11:54 localhost NetworkManager[1971]: <info>   nameserver '59.51.78.210'
Dec 14 05:11:54 localhost NetworkManager[1971]: <info>   domain name 'DHCP'
Dec 14 05:11:54 localhost NetworkManager[1971]: <info>   domain name 'HOST'
Dec 14 05:17:29 localhost APP[26091]: [file:main.c,line:18,func:main]ABC LOG_NOTICE
Dec 14 05:17:29 localhost APP[26091]: [file:main.c,line:19,func:main]ABC LOG_INFO
Dec 14 05:34:23 localhost APP[26372]: [file:main.c,line:18,func:main]ABC LOG_NOTICE
Dec 14 05:34:23 localhost APP[26372]: [file:main.c,line:19,func:main]ABC LOG_INFO



  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值