一般linux 下的c语音项目都会通过打印进行调试,简单临时的可能就使用printf函数进行凑合了,但是对于大一点的项目就不是很方便了,现在也有很多开源软件里面都有进行相应的日志功能的封装,不过那对于自己开发的项目调用就没那么简单了,所以基于此背景,写下自己的一点思路供大家参考,欢迎对不足的地方指出完善。
下面就把代码贴出来。
log.h
#ifndef _LOG_H
#define _LOG_H
#include
#include
#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
#include
#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]: prefix 24 (255.255.255.0)
Dec 14 05:11:54 localhost NetworkManager[1971]: gateway 192.168.0.1
Dec 14 05:11:54 localhost NetworkManager[1971]: nameserver '222.246.129.80'
Dec 14 05:11:54 localhost NetworkManager[1971]: nameserver '59.51.78.210'
Dec 14 05:11:54 localhost NetworkManager[1971]: domain name 'DHCP'
Dec 14 05:11:54 localhost NetworkManager[1971]: 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