当前位置: 首页 > news >正文

代码详细注释:基于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

代码功能说明:

  1. 日志系统初始化

    • 创建/打开日志文件(log.txt)

    • 设置终端和文件的日志记录级别

  2. 日志级别说明

    • LOG_TRACE < LOG_DEBUG < LOG_INFO < LOG_WARN < LOG_ERROR < LOG_FATAL

    • 终端只显示WARN及以上级别

    • 文件记录INFO及以上级别

  3. 日志输出测试

    • 输出各个级别的测试日志

    • 演示格式化日志输出功能

  4. 文件操作

    • 使用标准I/O函数(fopen/fclose)

    • "a+"模式保证日志追加而不覆盖

预期输出结果:

  1. 终端显示

    text

    [WARN] start warn.
    [ERROR] start error.
    [FATAL] start fatal
  2. 日志文件内容

    text

    [INFO] start info.
    [WARN] start warn.
    [ERROR] start error.
    [FATAL] start fatal
    [INFO] number is 10010, string is helloword

注意事项:

  1. 需要配套的log.h头文件实现日志功能

  2. 日志文件会持续追加,不会自动轮转

  3. 多线程环境下需要额外处理同步问题

http://www.dtcms.com/a/270300.html

相关文章:

  • 探索下一代云存储技术:对象存储、文件存储与块存储的区别与选择
  • Splunk练习 Boss of the SOC V1
  • 短视频矩阵系统的崛起:批量发布功能与多平台矩阵的未来
  • LeetCode 21. 合并两个有序链表
  • C#Halcon从零开发_Day18_OCR识别
  • 4. isaac sim4.2 教程-Core API-Hello robot
  • 【计算机组成原理】-CPU章节学习篇—笔记随笔
  • Linux 第一个系统程序 - 进度条
  • (C++)list列表相关基础用法(C++教程)(STL库基础教程)
  • 跨越NLP的三重曲线:从词法到叙事的进化之路
  • 使用python的 FastApi框架开发图书管理系统-前后端分离项目分享
  • huggingface笔记:文本生成Text generation
  • EXCEL(带图)转html
  • 基于LiteOS与SLE的多任务无线控制器项目实战
  • 深圳凭物联网软件开发构建智慧‘城市大脑‘
  • 什么是 3D 文件?
  • UE material advance 学习笔记
  • 【时时三省】(C语言基础)怎样引用指针变量
  • 免安装图片修改软件,一键批量处理
  • 16018.UE4+Airsim仿真环境搭建
  • 详细页智能解析算法:洞悉海量页面数据的核心技术
  • 软件系统测试的基本流程
  • 【PyTorch项目实战】VisRAG:基于视觉的多模态文档检索增强生成(文本+图像)
  • Android 事件分发机制深度解析
  • Android 中的多线程编程全面解析
  • YOLO融合[ICLR2025]PolaFormer中的极性感知线性注意力
  • docker proxy
  • C 解压文件
  • Day55 序列预测任务介绍
  • Subject vs Flowable vs Observable 对比