mongoose 的打印改造

news2025/1/15 13:56:31

        若要 mongoose.c 里的打印输出则需要在 main 函数里显式调用 mg_log_set(level),参数是打印等级,如:

mg_log_set(MG_LL_INFO);

这样设置之后,程序执行起来就可以实现打印输出了,但这个输出着实让人看得不太明白,其输出如下图:

其前 2 列表示什么一看是看不出来的,需要看代码,后几列无非就是文件名、行号、 函数名以及实际用户要输出的内容。看代码后才知道,第 1 列表示时间(单位是毫秒),第 2 列是打印等级,其定义如下:

enum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE };    

于是就有了这篇文章,改造它这个打印输出格式。改造后最终的效果如下图所示一目了然:

 首先看它的打印函数,其实就是宏定义,如下:

#if MG_ENABLE_LOG
#define MG_LOG(level, args)                                                \
  do {                                                                     \
    if (mg_log_prefix((level), __FILE__, __LINE__, __func__)) mg_log args; \
  } while (0)
#else
#define MG_LOG(level, args) \
  do {                      \
    if (0) mg_log args;     \
  } while (0)
#endif

#define MG_ERROR(args) MG_LOG(MG_LL_ERROR, args)
#define MG_INFO(args) MG_LOG(MG_LL_INFO, args)
#define MG_DEBUG(args) MG_LOG(MG_LL_DEBUG, args)
#define MG_VERBOSE(args) MG_LOG(MG_LL_VERBOSE, args)

可以看到宏 MG_LOG(level, args) 是分为两段的,第一段前缀相当于是固定的,第二段是用户实际要输出的内容,我们只看第一段就可以了。原来的输出格式中的第一列是时间,函数 mg_millis()获取,第二列就是输出打印等级 level 如:

改造的时候添加一个获取时间字符串的函数 getTimeStamp(),其实现如下:

static void getTimeStamp(char *outBuf, size_t len)
{
    time_t now;
    struct timeval tv;
    gettimeofday(&tv, NULL);
    now = tv.tv_sec;
    struct tm localTime;
    localtime_r(&now, &localTime);
    
    char timeBuf[128] = {0};
    strftime((char *)timeBuf, sizeof(timeBuf), "%Y/%m/%d %H:%M:%S", &localTime);
    snprintf(outBuf, len, "%s %06lu", timeBuf, tv.tv_usec % 1000000);
}

同时添加了打印等级对应的字符串,可读性更高一点,如:

static char *s_level_str[] = {
  "None",
  "Error",
  "Info",
  "Debug",
  "Verbose"
};

所以最终改造的打印前缀的函数就是这样子:

bool mg_log_prefix(int level, const char *file, int line, const char *fname) {
  if (level <= s_level) {
    const char *p = strrchr(file, '/');
    char buf[64];
    char timeBuf[128] = {0};
    size_t n;
    getTimeStamp(timeBuf, sizeof(timeBuf));

    if (p == NULL) p = strrchr(file, '\\');
    n = mg_snprintf(buf, sizeof(buf), "[%s %s] %s:%d:%s", timeBuf, s_level_str[level],
                    p == NULL ? file : p + 1, line, fname);
    if (n > sizeof(buf) - 2) n = sizeof(buf) - 2;
    int i = 0;
    while (n < sizeof(buf)) {
      buf[n++] = ' '; /*这里是填充空格*/
      if(i++ > 5) break; /*最多填充5个空格*/
    }
    
    logs(buf, n - 1);
    return true;
  } else {
    return false;
  }
}

while 循环那里就是填充空格,我这里最多只填充5个空格,太多也不好看,注意上面的 buf 的长度是64 字节,如果有函数名特别长那输出可能就被截断了。设置成 debug 等级,输出如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用

【详情链接】&#xff1a;基于Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247527433&idx2&sn4a73e8451b57819dce1b660b55f7befa&chksmfe68aa63c91f2375d992e418ea6006ab8ea835e…

[附源码]Nodejs计算机毕业设计基于的企业人事管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

使用Springboot框架手撸一个安全、可靠的本地缓存工具

前言&#x1f353; 在实现本地缓存的时候&#xff0c;我们经常使用线程安全的ConcurrentHashMap来暂存数据&#xff0c;然后加上SpringBoot自带的Scheduled定时刷新缓存。虽然这样可以实现本地缓存&#xff0c;但既不优雅也不安全&#xff0c;一个好的本地缓存工具应该是这样搭…

python 之 numpy图片处理 矩阵操作

目录 一&#xff1a;垂直方向翻转(行逆序) 二&#xff1a;水平方向翻转(列逆序) 三&#xff1a;垂直、水平方向翻转(行、列逆序) 四&#xff1a;调整亮度&#xff0c;变明亮*2.0 五&#xff1a;调整亮度&#xff0c;变暗 六&#xff1a;垂直方向裁剪 七&#xff1a;水平…

ESP32 ESP-IDF LVGL8 显示中文

陈拓 2022/12/15-2022/12/16 1. 开发环境 《ESP32 ESP-IDF LVGL8.3.3移植》 ESP32 ESP-IDF LVGL8.3.3移植_晨之清风的博客-CSDN博客ESP32 ESP-IDF LVGL8.3.3移植。https://blog.csdn.net/chentuo2000/article/details/128269394?spm1001.2014.3001.5501 2. 使用LVGL自带的中…

C# 创建WebService接口并连接

创建WebService项目 首先安装下.NET Framework4.6.2-4.7.1开发工具。 然后就是新建 ASP.NET Web应用程序 项目。 输入项目名称WebServiceDemo 选择空&#xff0c;然后先去掉HTTPS配置。 项目创建好之后&#xff0c;开始添加asmx文件. 添加好之后在添加一个有参数的名为Hel…

牛客java刷题知识点总结(六)

内存引用地址 内存引用地址&#xff0c;是指栈中存放的地址&#xff0c;来指向堆中的某个位置。 int 是基本类型&#xff0c;数据直接存放在栈中&#xff0c;不存在内存引用地址的说法 A对 指向常量池里的"hello"。 B对 题中没说声明的a是局部变量。 C错 int a 1;并…

DSPE-PEG-N3,磷脂-聚乙二醇-叠氮 点击化学PEG试剂,可用于药物传递、基因转染和生物分子修饰

中文名称 叠氮聚乙二醇磷脂、磷脂聚乙二醇叠氮 简称 N3-PEG-DSPE、DSPE-PEG-N3 物理性质&#xff1a;米白色/白色固体或粘性液体取决于分子量。 溶剂&#xff1a; 溶于大部分有机溶剂&#xff0c;和水有很好的溶解性。 活性基团&#xff1a; N3 反应基…

深度学习(17)—— 度量学习

深度学习&#xff08;17&#xff09;—— 度量学习 文章目录深度学习&#xff08;17&#xff09;—— 度量学习一、What?二、paired-based loss1. Contrastive loss2. Triplet loss3. Triplet center loss4.N-pair loss5. Quadruplet loss6. Lifted Structure Loss昨天讨论的时…

Linux安装tomcat 保姆级教程

一、安装前提 安装tomcat&#xff0c;前提需要安装jdk&#xff0c;如果没有安装 linux安装jdk教程(手动安装/yum安装) 保姆级教程_ 来杯咖啡的博客-CSDN博客 二、安装教程 1、下载tomcat tar包 官网下载地址: Apache Tomcat - Welcome! 2、将下载的压缩包上…

实验4 路由配置

实验4 路由配置一、实验目的二、实验要求三、实验步骤&#xff0c;数据记录及处理四&#xff0e;实验总结一、实验目的 1、路由配置&#xff1b; 2、配置静态路由&#xff1b; 3、掌握RIP协议配置。 二、实验要求 写出PC0与PC1连通的基本要求和配置过程 三、实验步骤&#…

UDP服务器

目录 一&#xff0c;介绍 二&#xff0c;日志 三&#xff0c;服务端 1&#xff0c;服务器参数 2&#xff0c;创建套接字 3,绑定 3.1 填充套接字信息 3.2 绑定 4&#xff0c;启动服务器 4.1接收客户端请求 4.2记录用户信息 4.3 消息转发 4.4 main函数代码 4.5服务器整…

单商户商城系统功能拆解47—应用中心—自定义海报

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

JVM之class加载过程

一、定义&#xff1a; java虚拟机把描述类的数据从class文件加载到内存&#xff0c;并对数据进行 校验/准备/解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这个过程被称作虚拟机的类加载机制。 称作虚拟机的类加载机制。 loading -> linki…

南卡和FIIL蓝牙耳机哪个比较好?数码达人深度对比评测

2023即将到来&#xff0c;蓝牙耳机对于大部分人来说&#xff0c;成为了越来越重要的存在。日常生活中随处可见的都是在使用蓝牙耳机的人&#xff0c;有听歌的、看剧的、玩游戏的等等。伴随着更多的人使用蓝牙耳机&#xff0c;市面上可见的蓝牙耳机数量正在飙升&#xff0c;这也…

MySQL 的自增主键一定是连续的吗?

全文摘要&#xff1a;结合实例分析了自增值保存在哪里&#xff0c;自增值的修改策略&#xff0c;以及自增值不连续的四个场景&#xff0c;希望对各位小伙伴们有所帮助~ 众所周知&#xff0c;自增主键可以让聚集索引尽量地保持递增顺序插入&#xff0c;避免了随机查询&#xff…

微软确认配置错误导致65,000多家公司的数据泄露

©网络研究院 微软证实&#xff0c;在安全漏洞导致端点无需任何身份验证即可通过互联网公开访问后&#xff0c;它无意中暴露了与数千名客户相关的信息。 微软在警报中表示&#xff1a; “这种错误配置可能导致未经身份验证访问与微软和潜在客户之间的交互相对应的一些业务…

互联网大厂Java岗考点(阿里+百度+腾讯+字节跳动+美团+京东)

本文扼要 本文结构主要分为以下三个部分&#xff1a; 01 互联网大厂考点&#xff08;阿里百度腾讯字节跳动美团京东&#xff09;02 Java 面试考点大全&#xff08;基本功底常用技术技术深度技术经验学习能力工作能力项目经验&#xff09;03 面试真题重现 01 互联网大厂考点 …

OPSS-PEG-N3叠氮聚乙二醇巯基吡啶, N3-PEG-OPSS,点击化学PEG试剂

名称 叠氮聚乙二醇巯基吡啶 N3-PEG-OPSS 中文名称 叠氮PEG巯基吡啶 巯基吡啶PEG叠氮 巯基吡啶聚乙二醇叠氮 英文名称 N3-PEG-OPSS OPSS-PEG-N3 Azide-PEG-OPSS OPSS-PEG-Azide 溶剂 溶于二氯甲烷&#xff0c;氯仿&#xff0c;乙酸乙酯&#xff0c;四氢呋喃等有机溶剂 存储条…

pycharm安装使用pyQt5

一、创建项目 二、安装pyqt5库 三、配置PyCharm外部工具 打开File->settings->Tools->External Tools 1、配置QtDesigner 程序&#xff1a;D:\python3.7\Lib\site-packages\qt5_applications\Qt\bin\designer.exe//安装包的时候回自动下载&#xff0c;直接在包文件…