C语言自我实现模块化打印log

2023-05-16

在一个嵌入式稍微大些的工程中实现模块化控制打印输出信息是很有必要的,下面是模仿别人的实现的模块化打印,需要时可以根据下面的实现代码去修改满足自己所需要的!!!

#include <stdio.h>
#include <string.h>
#include <stdint.h>

/*
 * @brief print switch definition
 */
typedef enum {
    DEBUG_LOG_ON,
    DEBUG_LOG_OFF
} log_switch_t;

/**
 * @brief print level definition
 */
typedef enum {
    PRINT_LEVEL_DEBUG,
    PRINT_LEVEL_INFO,
    PRINT_LEVEL_WARNING,
    PRINT_LEVEL_ERROR
} print_level_t;

//函数指针
typedef void (*f_print_t)(void *handle, const char *func, int line, print_level_t level, const char *message, ...);

/**
 * @brief log context definition
 */
typedef struct {
    const char *module_name;
    log_switch_t    log_switch;
    print_level_t   print_level;
    f_print_t       print_handle;
} log_control_block_t;

void print_module_log(void *handle, const char *func, int line, print_level_t level, const char *message, ...);

/**
 * @brief create log context for a module
 */
#define log_create_module(_module, _level) \
log_control_block_t log_control_block_##_module = \
{ \
    #_module, \
    (DEBUG_LOG_OFF), \
    (_level), \
    print_module_log \
}

/**
 * @brief print info level log message
 */
#define LOG_I(_module, _message, ...) \
do { \
    log_control_block_##_module.print_handle(&log_control_block_##_module, \
                                           __func__, \
                                           __LINE__, \
                                           PRINT_LEVEL_INFO, \
                                           (_message), \
                                           ##__VA_ARGS__); \
} while(0)

/**
 * @brief turn on or off the print switch
 */
#define log_config_print_switch(_module, _log_switch) \
do { \
    log_control_block_##_module.log_switch = (_log_switch); \
} while (0)


void print_module_log(void *handle, const char *func, int line, print_level_t level, const char *message, ...)
{
    log_control_block_t* log_cotrol_block = (log_control_block_t*)handle;
    if(log_cotrol_block->log_switch == DEBUG_LOG_ON)
    {
        char my_level[10] = {0};
        switch(level)
        {
            case PRINT_LEVEL_DEBUG:
                strcpy(my_level, "DEBUG");
                break;

            case PRINT_LEVEL_INFO:
                strcpy(my_level, "INFO");
                break;

            case PRINT_LEVEL_WARNING:
                strcpy(my_level, "WARNING");
                break;
            
            case PRINT_LEVEL_ERROR:
                strcpy(my_level, "ERROR");
                break;
            
            default:
                break;
        }
        __builtin_va_list __local_argv;
        printf("[%s %d %s]", my_level, line, log_cotrol_block->module_name);
        printf (message, __local_argv);
    }
}

int main()
{
    log_create_module(YANG, PRINT_LEVEL_INFO);
    log_config_print_switch(YANG, DEBUG_LOG_ON);

    log_create_module(HI, PRINT_LEVEL_INFO);
    log_config_print_switch(HI, DEBUG_LOG_OFF);
    

    LOG_I(YANG, "hello, YANG!!!\r\n");
    LOG_I(HI, "hello, hi!!!\r\n");
    return 0;
}


输出结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言自我实现模块化打印log 的相关文章

  • android设备收到电话没有弹窗,怎么抓这个报错的log

    如果您的 Android 设备没有弹出电话窗口 xff0c 可以按照以下步骤捕获此错误的日志 xff1a 在您的 Android 设备上打开 设置 应用 在设置中 xff0c 找到 开发人员选项 并打开 在开发人员选项中 xff0c 找到
  • 【MySQL】MySQL进阶之路(六)MySQL三大日志(binlog、redo log和undo log)详解

    写在前面的话 脑子是个好东西 xff0c 可惜的是一直没有搞懂脑子的内存删除机制是什么 xff0c 所以啊 xff0c 入行多年 xff0c 零零散散的文章看了无数 xff0c 却总是学习了很多也忘了很多 痛定思痛的我决定从今天开始系统的梳
  • android log详解

    之前两篇文章之后 xff0c 打算再分享一点儿经验 xff1a 之前文章见这里 xff1a 1 xff0c 全看懂了 加两年经验 语音朗读 语音识别 语音控制软件源码 2 xff0c 学生作品 配置NDK集成开发环境全过程第一版 这次打算通
  • Undo Log学习

    一 Undo Log的作用 数据库故障恢复机制的前世今生中提到过 xff0c Undo Log用来记录每次修改之前的历史值 xff0c 配合Redo Log用于故障恢复 这也就是InnoDB中Undo Log的第一个作用 xff1a 1 事
  • Docker启动MySQL在log日志中发现报错unknown variable ‘default_character_set=utf8‘.

    问题 xff1a 前一天我将mysql配置好了 xff0c 就关闭了 xff0c 第二天重新启动mysql容器发现刚启动完 xff0c 就停止掉了 xff0c 很离谱 xff01 xff01 xff01 解决方案 xff1a docker
  • mysql general log

    mysql 打开 general log 后 xff0c 所有的查询语句都会记录在 general log 文件 xff0c 文件为只读方式 xff0c 但这样general log文件会非常大 xff0c 所以默认是关闭的 但有时需要查错
  • 用QXDM获取log的方法说明

    用 QXDM 获取 log 的方法说明 对于获取 LOG 可能我们会有一些误解 测试人员害怕得到的 LOG 信息不全 而将所有的选项都选上 希望能够得到最全的 LOG 其实不然 受到手机及手机与 PC 的通讯限制 如果选择保存所有的 LOG
  • xcode Swift Log CocoaLumberjack

    参考 iOS CocoaLumberJack日志库集成 简书 logging How to capture Device Logs in iOS during Runtime into a file in Documents Directo
  • python解析log文件_python解析基于xml格式的日志文件

    大家中午好 xff0c 由于过年一直还没回到状态 xff0c 好久没分享一波小知识了 xff0c 今天 xff0c 继续给大家分享一波Python解析日志的小脚本 首先 xff0c 同样的先看看日志是个啥样 都是xml格式的 xff0c 是
  • SecureCRT抓取串口log

    一 通用自动配置 通用自动配置是指配置之后 xff0c 每次创建新的session都会导入该配置 xff0c 无需重复配置 xff0c 非常方便 首先在option里面找到Global Options xff1b 在Global Optio
  • Unity项目关闭Debug.Log没有Log

    接手的项目打包后没有记录自定义Log 卧槽 xff0c 这我怎么debug 搜索了一堆都只有说怎么关闭 xff0c 没什么怎么打开的 以至于我明明加了Andrid关键词还有说设置Use Player Log的 换了个关键词搜索怎么关闭 xf
  • Eclipse打不开,提示查看Log文件

    今天在使用Eclipse的时候 xff0c Eclipse整个黑屏 xff0c 然后果断启动任务管理器 xff0c 关掉了Eclipse然后重启 xff0c 发现Eclipse打不开了 xff0c 然后提示查看log文件 xff0c 然后解
  • Git--log 查看提交历史

    注意 xff1a Author 表示对代码做出修改的人 Date 表示对代码做出修改的时间 Commit 表示提交代码的人 xff0c CommitDate 表示提交代码的时间 实际工作中 xff0c Author 并不一定就是Commit
  • Python中用于计算对数的log()方法

    本文转载至 xff1a http www jb51 net article 66130 htm 这篇文章主要介绍了Python中用于计算对数的log 方法 是Python入门基础中的必会的方法 需要的朋友可以参考下 log 方法返回x的自然
  • 各种log的加载过程

    1 概述 现在的log框架越来越多 目前我们系统用有使用的包括commons logging log4j slf4j 还有 一个号称更快的logback暂时基本没有用到 而这些log系统又常常依赖于一些jar包顺序和静态配置 导致比较混乱
  • 2018-02-07 如何记录日志

    一 简介 二 记录日志的目的 why 开发调试 记录用户行为 程序运行状况 系统 机器状况 三 日志的要素 what 时间 位置 级别 内容 唯一标识 事件上下文 格式化 其他 四 记录日志的一些原则和技巧 使用框架或模块 不能出错 避免敏
  • mmdetection W&B 用wandb权重和偏差以进行记录

    如题 共需要修改四个文件 1 mmcv runner hooks logger init py from pavi import PaviLoggerHook from tensorboard import TensorboardLogge
  • 如何使用 Rsyslog 和 MySQL 设置 LogAnalyzer

    本文是文章的第二部分使用 MySQL 和 LogAnalyzer 设置 Rsyslog在 CentOS RHEL 系统上 在里面第一部分我们已经将Rsyslog与MySQL数据库服务器集成 所有日志现在都保存在数据库中 下面是我们在第 1
  • 132_Springboot总是会自动在/tmp/spring.log生成日志文件问题处理

    原因是项目配置文件中有如下引用
  • c#中日志NLog配置问题

    Failed obtaining configuration for Common Logging from configuration section common logging 在配置中没有配置对 另外很有可能是NLog 的配置文件没

随机推荐

  • gsch和redirfs模块导致系统hang或者重启 。

    Trend Micro Deep Security Agent 与Gluster 文件系统不兼容导致夯机 modules 34 gsch and redirfs 34 causing frequent kernel panic Trend
  • RedHat Linux系统故障修复—— grub引导、MBR损坏修复过程

    一 故障问题 MBR损坏是一种非常常见的错误 xff0c 两种情况 xff1a 1 MBR文件损坏 2 grub目录被误删除 1 首先 xff0c MBR是安装在硬盘的第一个扇区上占用了512个字节 xff0c 其中前446字节是bootl
  • 在救援模式下收集 sosreport

    问题 如何在救援模式下收集 sosreport xff1f 对于无法正常启动的操作系统 xff0c 如何收集 sosreport xff1f Red Hat Enterprise Linux 系统无法启动 当技术支持人员需要相关信息来进行问
  • 在Linux系统救援环境中实现联网

    环境 救援环境下的红帽企业 Linux 5 6 7 8 9 问题 生成了 sosreport 在初始救援环境设置期间未启用网络 解决方案 使用 IP 命令套件 iproute 包 xff1a 1 ip link 将显示连接到系统的可用设备
  • Rsa读取pem公钥和私钥

    1 把pem文件用text打开 xff0c 把开头和结尾的begin和end内容删去 xff0c 只留下字符串内容 xff1b 2 用流读取文件中的字符串 xff1b 3 用以下代码生成公钥和私钥对象 xff1b public static
  • 当 rsync/scp 不可用时,从系统传输文件或者 sosreport。

    环境 红帽企业 Linux 5 x红帽企业 Linux 6 x红帽企业 Linux 7 x 问题 文件需要转移到另一个系统 xff0c 但是ssh和rsync未设置和 或允许 一个sosreport需要转移到另一个系统 红帽企业 Linux
  • 如何配置Linux操作系统内DNS配置不被DHCP自动更新

    问题原因 NetworkManager是一个软件工具 xff0c 旨在简化计算机网络的使用 NetworkManager可用于基于Linux内核和其他类Unix操作系统 目前主流Linux操作系统都使用NetworkManager进行网络自
  • 2021-09-27

    虚拟环境中用pip下载安装包却安装到base环境解决方案 原因解决方案 遇到的问题 xff1a windows环境下进入虚拟环境 xff0c 使用pip install指令安装包时发现没有安装到虚拟环境下 xff0c 而是安装到了base环
  • 网络服务(Neutron)安装配置 ,这一篇就够了!

    实验目标 OpenStack Networking xff08 neutron xff09 xff0c 允许创建 插入接口设备 xff0c 这些设备由其它的OpenStack服务管理 插件式的实现可以容纳不同的网络设备和软件 xff0c 为
  • ssh服务和日志的基本常识

    查看网桥 brctl show 创建链接 ln s mnt dir file mnt lianjie 1 查看进程 gnome system monltor ps 当前shell的进程 A 所有的进程 a shell中所有的进程 xff0c
  • ESP8266基础详细使用

    前言 刚买一块ESP8266 琢磨一天才弄明白怎么使用 xff0c 小白第一次弄这个确实不太友好 xff0c 这里记录一下 xff0c 怕以后自己用到又忘了 xff0c 在物联网这一方面ESP8266还是特别实用的 材料准备 淘宝 xff0
  • nvm安装流程

    nvm nvm是管理node版本的工具 一般我们会负责多个项目 xff0c 不同项目有不同版本的node环境 xff0c 此时就需要nvm对node版本进行切换处理 1 首先卸载node 2 nvm下载 安装包下载地址 xff1a http
  • 树莓派 raspbian (各版本)换国内源

    xff08 看到师兄的博客后感觉还行 xff0c 所以自己也来写下 xff0c 第一次写 xff0c 所以不会编排 xff0c 有什么错误希望被指出 xff0c 谢谢 xff09 相信来寻找换源的人都和一样知道为什么要换国内更新源了吧 xf
  • 树莓派4b的i2c配置及wiringPi通信

    一 配置i2c设备 1 xff09 在终端中操作 xff0c 输入指令 sudo raspi config 2 xff09 然后会出现设置界面 xff0c 然后跟着如下图片操作 第一项 xff1a Change User Password
  • 树莓派驱动之设备树覆盖

    一 前言 由于是初学者 xff0c 所以对于一些操作需要记录下方便自己查找 附上 xff1a 树莓派设备树官网 我只从官网上了解到一点点内容 xff0c 还有许多没看懂的和还没学的 一个常规的Arm Linux设备树 xff0c 主要是由源
  • ConcurrentHashMap 常用方法

    void clear 从该映射中移除所有映射关系 boolean containsKey Object key 测试指定对象是否为此表中的键 boolean containsValue Object value 如果此映射将一个或多个键映射
  • .vscode中常用的配置文件

    文件 一 安装常用插件二 c cpp properties json文件三 settings json文件 一 安装常用插件 根据自己需要安装相应的插件 xff1a span class token number 1 span span c
  • 操作系统相关知识

    目录 一 嵌入式操作系统二 实时操作系统 xff08 RTOS xff09 三 Freertos 操作系统四 Linux xff08 操作系统 xff09 五 Linux 和 FreeRTOS操作系统的区别 xff08 面试中被问到 xff
  • 结构体对齐(全)

    目录 一 结构体对齐规则二 结构体位域对齐规则 一 结构体对齐规则 1 第一个成员在与结构体偏移量为0的地址处 xff1b 2 其他成员变量要与自身类型的整数倍地址处对齐 xff1b 3 结构体总大小为要与 处理器字节数与成员类型所占字节数
  • C语言自我实现模块化打印log

    在一个嵌入式稍微大些的工程中实现模块化控制打印输出信息是很有必要的 xff0c 下面是模仿别人的实现的模块化打印 xff0c 需要时可以根据下面的实现代码去修改满足自己所需要的 xff01 xff01 xff01 span class to