代码详细注释:基于log.h的自定义日志库实现
代码
/*5.自定义日志*/
#include <stdio.h> // 标准输入输出头文件
#include <stdlib.h> // 标准库头文件
#include <string.h> // 字符串处理头文件
#include <strings.h> // 字符串操作头文件(兼容旧版)
#include <fcntl.h> // 文件控制头文件
#include <sys/types.h> // 系统数据类型头文件
#include <sys/stat.h> // 文件状态头文件
#include <unistd.h> // UNIX标准头文件
#include <time.h> // 时间处理头文件
#include "log.h" // 自定义日志头文件int main(int argc, char *argv[]) // 主函数
{// 以追加模式打开日志文件(不存在则创建)FILE *fp = fopen("log.txt", "a+"); if(fp == NULL){ // 检查文件是否成功打开printf("create log file failed.\n"); // 打印错误信息return -1; // 返回错误码}// 设置终端日志输出级别为WARN(只显示WARN及以上级别)log_set_level(LOG_WARN); // 设置文件日志输出级别为INFO(记录INFO及以上级别)log_add_fp(fp, LOG_INFO); // 测试不同级别的日志输出log_trace("start trace."); // TRACE级别日志(最低级别)log_debug("start debug."); // DEBUG级别日志log_info("start info."); // INFO级别日志log_warn("start warn."); // WARN级别日志log_error("start error."); // ERROR级别日志log_fatal("start fatal"); // FATAL级别日志(最高级别)// 测试带格式化的日志输出log_info("number is %d, string is %s", 10010, "helloword"); // 格式化日志fclose(fp); // 关闭日志文件return 0; // 程序正常退出
}
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
代码功能说明:
日志系统初始化:
创建/打开日志文件(
log.txt
)设置终端和文件的日志记录级别
日志级别说明:
LOG_TRACE
<LOG_DEBUG
<LOG_INFO
<LOG_WARN
<LOG_ERROR
<LOG_FATAL
终端只显示WARN及以上级别
文件记录INFO及以上级别
日志输出测试:
输出各个级别的测试日志
演示格式化日志输出功能
文件操作:
使用标准I/O函数(
fopen
/fclose
)"a+"模式保证日志追加而不覆盖
预期输出结果:
终端显示:
text
[WARN] start warn. [ERROR] start error. [FATAL] start fatal
日志文件内容:
text
[INFO] start info. [WARN] start warn. [ERROR] start error. [FATAL] start fatal [INFO] number is 10010, string is helloword
注意事项:
需要配套的
log.h
头文件实现日志功能日志文件会持续追加,不会自动轮转
多线程环境下需要额外处理同步问题