linux c日志功能实现
阅读原文时间:2021年04月24日阅读:1

一般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]:    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