1.概述
c语言没有现成的日志库,如果要记录日志,需要自己封装一个日志库。如果要实现日志级别和参数打印,还是比较麻烦的,正好在github找到了一个c语言开源日志库,可以实现日志级别打印,参数打印,而且还会记录日期和行号,最重要的是代码非常少,只有100多行,可以直接包含在我们自己的工程代码中,不需要任何依赖。
2.源码地址
GitCode - 全球开发者的开源社区,开源代码托管平台
3.使用介绍
3.1直接把工程目录下的log.c和log.h下载下来,包含到工程代码中即可,没有其他依赖。
3.2日志级别由低到高,分别为 LOG_TRACE、LOG_DEBUG、LOG_INFO、LOG_WARN、LOG_ERROR、LOG_FATAL
3.3如果设置日志级别为LOG_TRACE,则所有级别日志都会打印,如果设置日志级别为LOG_WARN,则只会打印LOG_WARN以及更高级别(即LOG_ERROR和LOG_FATAL)的日志
4.测试代码
log.c
#include "log.h"
#include <stdio.h>int main() {FILE *fp = fopen("log.txt", "a+");if(fp == NULL){printf("create log file failed.\n");return -1;}//设置日志级别(在终端打印)log_set_level(LOG_TRACE);//设置日志级别(在文件中打印)log_add_fp(fp, LOG_INFO);log_trace("start trace.");log_debug("start debug.");log_info("start info.");log_warn("start warn.");log_error("start error.");log_fatal("start fatal");// 支持参数打印log_info("number is %d, string is %s", 10010, "helloword");fclose(fp);
}
log.h
/*** Copyright (c) 2020 rxi** This library is free software; you can redistribute it and/or modify it* under the terms of the MIT license. See `log.c` for details.*/#ifndef LOG_H
#define LOG_H#include <stdio.h>
#include <stdarg.h>
#include <stdbool.h>
#include <time.h>#define LOG_VERSION "0.1.0"typedef struct {va_list ap;const char *fmt;const char *file;struct tm *time;void *udata;int line;int level;
} log_Event;typedef void (*log_LogFn)(log_Event *ev);
typedef void (*log_LockFn)(bool lock, void *udata);enum { LOG_TRACE, LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR, LOG_FATAL };#define log_trace(...) log_log(LOG_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define log_debug(...) log_log(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define log_info(...) log_log(LOG_INFO, __FILE__, __LINE__, __VA_ARGS__)
#define log_warn(...) log_log(LOG_WARN, __FILE__, __LINE__, __VA_ARGS__)
#define log_error(...) log_log(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
#define log_fatal(...) log_log(LOG_FATAL, __FILE__, __LINE__, __VA_ARGS__)const char* log_level_string(int level);
void log_set_lock(log_LockFn fn, void *udata);
void log_set_level(int level);
void log_set_quiet(bool enable);
int log_add_callback(log_LogFn fn, void *udata, int level);
int log_add_fp(FILE *fp, int level);void log_log(int level, const char *file, int line, const char *fmt, ...);#endif