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中Log详解--输出到不同设备

    Android中Log信息的输出方法 共两篇文章 xff0c 第一篇讲述了如何在程序中输出Log信息 xff0c 第二篇详细的分析了Log信息的输出机制 下面是第一篇 转自 xff1a http blog 163 com binghaita
  • SecureCRT串口log输出时间信息

    原文地址 SecureCRT串口log输出时间信息 wfzlry的博客 CSDN博客 securecrt显示时间 目录 0 SecureCRT版本信息 1 连接串口之前的全局设定 xff1a 2 Quick Connect连接串口 3 查看
  • android抓取各种log的方法

    1 logcat xff08 四类log buffer是main xff0c radio xff0c system xff0c events xff09 adb wait for device logcat adb logcat v tim
  • Docker启动MySQL在log日志中发现报错unknown variable ‘default_character_set=utf8‘.

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

    slf4j是Java的一种Log Api xff0c 类似Apache Commons Logging 最直接的log方式 logger debug 34 Entry number 34 43 i 43 34 is 34 43 String
  • python解析log文件_python解析基于xml格式的日志文件

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

  • Linux 通过 log 日志检查服务器是否被暴力破解

    远程服务器一般需要启用 ssh 远程登录功能 对于 ssh 协议的常见攻击是进行暴力破解 通过查看 log 日志检测服务器是否被暴力破解 日志位置 不同的linux发行版 xff0c 关于 ssh 登录的日志信息存储的地方不同 xff1a
  • Git--log 查看提交历史

    注意 xff1a Author 表示对代码做出修改的人 Date 表示对代码做出修改的时间 Commit 表示提交代码的人 xff0c CommitDate 表示提交代码的时间 实际工作中 xff0c Author 并不一定就是Commit
  • 开启openfire的log聊天记录功能

    http stackoverflow com questions 6635034 read chat histroy from openfire server with smack Openfire server can surely sa
  • Canal 读取 mysql bin_log

    场景 xff1a 在微服务开发的过程中多个项目协同完成一个功能 xff0c 工程与工程之间存在数据上的解耦 xff0c 底层服务为上层服务提供数据 而底层服务有需要对数据进行管理 解决方案 xff1a 基本底层服务 通过 canal 获取
  • Ardupilot添加自定义日志(AP_LOG)

    1 在libraries AP Logger LogStructure h中添加自定义的结构体 span class token keyword struct span span class token class name PACKED
  • Nginx根据Status保存日志,及ngx_http_log_module 模块介绍

    前言 Nginx日志对于统计 系统服务排错很有用 Nginx日志主要分为两种 xff1a access log 访问日志 和error log 错误日志 通过访问日志我们可以得到用户的IP地址 浏览器的信息 xff0c 请求的处理时间等信息
  • Git 版本回退与前进(03)

    现在 你已经学会了修改文件 然后把修改提交到Git版本库 现在 再练习一次 修改readme txt文件如下 Git is a distributed version control system Git is free software
  • 2018-02-07 如何记录日志

    一 简介 二 记录日志的目的 why 开发调试 记录用户行为 程序运行状况 系统 机器状况 三 日志的要素 what 时间 位置 级别 内容 唯一标识 事件上下文 格式化 其他 四 记录日志的一些原则和技巧 使用框架或模块 不能出错 避免敏
  • 【Log日志】springboot项目中集成Log日志详解

    springboot项目中集成Log日志详解 一 Log日志介绍 1 Log 日志组件主要作用及用途 2 日志的级别Level 级别控制 3 日志的输出Import 3 1 快速使用 3 2 日志文件输出 3 3 自定义配置 4 Sprin
  • 一个简单通用的logback配置文件

    首先pom依赖于ch qos logback基于slf4j
  • mmdetection W&B 用wandb权重和偏差以进行记录

    如题 共需要修改四个文件 1 mmcv runner hooks logger init py from pavi import PaviLoggerHook from tensorboard import TensorboardLogge
  • c#中日志NLog配置问题

    Failed obtaining configuration for Common Logging from configuration section common logging 在配置中没有配置对 另外很有可能是NLog 的配置文件没
  • python pyplot logscale 画图对数

    原文来自公众号 工程师看海 事情的起因是我要在公众号 工程师看海 更新一篇文章 介绍电感 磁珠的区别 需要画阻抗 频率曲线 横坐标频率要按照log对数尺度缩放 就写了python代码 废话不多说 先看结果 公众号后台回复 python lo

随机推荐

  • 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