c++打印log宏定义

c语言demo,简单日志实现:

仿android  自动添加系统时间,进程号,线程号。 记录,以备不时之需.

#define LOG_D(...)  do {printf("[%s %d %ld D ]",getCurtimeMsStr().c_str(),getpid(),gettid());printf(__VA_ARGS__);printf("\n");} while(0)// 定义LOGD类型


#include <sys/time.h>
#include <time.h>#include <string>
#include<string.h>#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
//    struct timeval {
//        time_t      tv_sec;     /* seconds */
//        suseconds_t tv_usec;    /* microseconds */
//    };// 如果报错 gettid(), 加上下面这个定义
#include <sys/syscall.h>
#define gettid() syscall(__NR_gettid)inline long long getCurtTimeMs(void)
{struct timeval tv;gettimeofday(&tv,NULL);return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}time_t getCurSecond(void){// 返回秒数,精度低于gettimeofday()return time(NULL);
}std::string getCurtimeStr(void){struct timeval tv;gettimeofday(&tv,NULL);// gmtime不带时区信息,将time_t 转换为struct tm.      localtime作用相同,但是待带时区信息。 两者都不是线程安全的。// struct tm *st_tm = gmtime(&tv.tv_sec);// struct tm *st_tm = (struct tm*)calloc(1,sizeof(struct tm));struct tm st_tm;localtime_r(&tv.tv_sec,&st_tm);char timebuf[128]={0};strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S",&st_tm);return std::string(timebuf);
}std::string getCurtimeMsStr(void){struct timeval tv;gettimeofday(&tv,NULL);// gmtime不带时区信息,将time_t 转换为struct tm.      localtime作用相同,但是待带时区信息。 两者都不是线程安全的。// struct tm *st_tm = gmtime(&tv.tv_sec);// struct tm *st_tm = (struct tm*)calloc(1,sizeof(struct tm));struct tm st_tm;localtime_r(&tv.tv_sec,&st_tm);char timebuf[128]={0};strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S",&st_tm);snprintf(timebuf+strlen(timebuf),sizeof(timebuf),".%03d",(int)(tv.tv_usec%1000));return std::string(timebuf);
}#if 1
#define LOG_D(...)  do {printf("[%s %d %ld D ]",getCurtimeMsStr().c_str(),getpid(),gettid());printf(__VA_ARGS__);printf("\n");} while(0)// 定义LOGD类型
#define LOG_I(...)  do {printf("[%s %d %ld I ]",getCurtimeMsStr().c_str(),getpid(),gettid());printf(__VA_ARGS__);printf("\n");} while(0) // 定义LOGI类型
#define LOG_W(...)  do {printf("[%s %d %ld W ]",getCurtimeMsStr().c_str(),getpid(),gettid());printf(__VA_ARGS__);printf("\n");} while(0) // 定义LOGW类型
#define LOG_E(...)  do {printf("[%s %d %ld E ]",getCurtimeMsStr().c_str(),getpid(),gettid());printf(__VA_ARGS__);printf("\n");} while(0) // 定义LOGE类型
#define LOG_F(...)  do {printf("[%s %d %ld F ]",getCurtimeMsStr().c_str(),getpid(),gettid());printf(__VA_ARGS__);printf("\n");} while(0) // 定义LOGF类型
#else
#define LOG_D(...)
#define LOG_I(...)
#define LOG_W(...)
#define LOG_E(...)
#define LOG_F(...)
#endif#define LOG_RED(...)  do {printf("\033[31m"); printf(__VA_ARGS__);printf("\n \033[0m"); } while(0)
#define LOG_GREEN(...)  do {printf("\033[32m"); printf(__VA_ARGS__);printf("\n \033[0m"); } while(0)int main(int argc, const char*argv[]){printf("[%s]\n",getCurtimeStr().c_str());printf("[%s]\n",getCurtimeMsStr().c_str());LOG_D("%s",getCurtimeMsStr().c_str());return 0;
}

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

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

相关文章

vue3中压缩图片的大小

效果 上传一张图片&#xff0c;看看文件的大小。我们会发现小了很多 思路 图片太大也是因为宽高太大&#xff0c;进行宽高的缩放就可以了 实现过程 const onUpload async ({ file }) > {console.log(file);if (file.size / 1024 / 1024 > 100) {message.error(大小不…

uniapp模仿下拉框实现文字联想功能 - uniapp输入联想(官方样式-附源码)

一、效果 废话不多说&#xff0c;上效果图&#xff1a; 在下方的&#xff1a; 在上方的&#xff1a; 二、源码 一般是个输入框&#xff0c;输入关键词&#xff0c;下拉一个搜索列表。 ElementUI有提供<el-autocomplete>&#xff0c;但uniapp官网没提供这么细&#x…

备考2024年北京高考数学:20114~2023十年选择题练习和解析

距离2024年高考还有三个月的时间&#xff0c;如何用三个月的时间再提高北京数学高考的成绩&#xff1f;吃透历年真题以及背后的知识点是行之有效的方法 之一。 今天我们来看一下2014-2023年的北京市高考数学的选择题&#xff0c;从过去十年&#xff08;2014-2023&#xff09;的…

Redis--不可不知的热门面试题

redis在使用过程中明明内存充足但是插入数据失败怎么排查? 是否是网络问题&#xff1a;客户端使用脚本定时ping Redis服务器&#xff0c;未有丢包情况&#xff0c;排除网络问题。是否是连接池满了&#xff1a;客户端连接池满了&#xff0c;检查客户端连接最大限制maxActive是…

深入浅出解析SSL:保障网络安全的加密技术

在数字信息时代&#xff0c;网络安全已成为人们关注的重点。为了在网络传输过程中保护数据的完整性和机密性&#xff0c;我们需要一种强大的安全协议——SSL&#xff08;安全套接层&#xff09;。今天德迅云安全就带大家来简单了解下SSL是什么&#xff0c;它的工作原理以及为何…

SpringCloudGateway理论与实践

文章目录 网关介绍为什么需要网关Gateway 使用gateway pom依赖yml 配置重启测试总结 断言过滤器工厂路由过滤器的种类请求头过滤器默认过滤器总结 网关介绍 Spring Cloud Gateway 是一个基于Spring Framework 5&#xff0c;由Spring Cloud团队开发的全新的API网关服务。它旨在…

qtvs2022工程cmakelist.txt添加QCharts模块

find_package(QT NAMES Qt5 COMPONENTS Core Gui Widgets OpenGL Concurrent Charts Sql Network REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Widgets OpenGL Charts Concurrent Sql Network REQUIRED)这里find_package只是设置搜索路径&#xff0c;为…

ES入门十:关系模型的实现:嵌套类型和父子文档

现实中&#xff0c;关系模型是到处存在的&#xff0c;例如书本与作者的关系。但是在ES中想要处理这个事情并不简单 在ES中保存关系型模型数据的方式主要有以下几种&#xff1a; nested&#xff1a;在这种方式中&#xff0c;会通过一对多的放系保存在同一个文档中join&#xf…

PC电脑可以当服务器使用吗?

PC电脑是一种性能、大小适用于个人使用的多用途计算机&#xff0c;是由硬件系统和软件系统共同组成&#xff0c;能够独立运行并且完成特定功能的设备&#xff0c;那有的人就会问PC电脑可以当做服务器来进行使用吗&#xff1f;答案是可以的。 PC电脑可以当做服务器来使用&#x…

Centos 9 安装 k8s

为了尽可能契合生产环境的部署情况&#xff0c;这里用kubeadm安装集群&#xff0c;同时方便跟随笔记一步步实践的过程&#xff0c;也更加了解k8s的一些特性和基础知识。 先决条件 这里将通过虚拟机安装3台centos stream 9服务器&#xff0c;并组成kubeneters集群&#xff08;…

Vue基础篇

Vue Vue是一套用于构建用户界面的渐进式JavaScript框架 什么是渐进式? Vue可以自底向上逐层地应用; 当构建简单应用时, 只需一个轻量小巧的核心库; 当构建复杂应用时, 可以引入各式各样的Vue插件 Vue具有以下特点: 采用组件化模式, 提高代码复用率且让代码更好维护 声明式编…

Vue+SpringBoot打造考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

Pandas isin()函数介绍

简介 isin() 函数是 Pandas 库中的一个非常实用的函数&#xff0c;主要用于筛选数据框&#xff08;DataFrame&#xff09;或序列&#xff08;Series&#xff09;中包含特定值的数据。这个函数可以接收一个列表、集合或其他可迭代对象作为参数&#xff0c;并返回一个布尔型的序…

10 个 Java Stream 顶级技巧,大量简化代码

Java Stream API对于 Java 开发人员来说就像一把瑞士军刀 — 它用途广泛、结构紧凑,并且可以轻松处理各种任务。 它为开发人员提供了一种函数式和声明式的方式来表达复杂的数据转换和操作,使代码更加简洁和富有表现力。 但能力越大,责任越大,有效地使用Stream API需要对最…

MySQL学习笔记(一)数据库事务隔离级别与多版本并发控制(MVCC)

一、数据库事务隔离级别 数据库事务的隔离级别有4种&#xff0c;由低到高分别为Read uncommitted &#xff08;读未提交&#xff09;、Read committed&#xff08;读提交&#xff09; 、Repeatable read&#xff08;可重复读&#xff09; 、Serializable &#xff08;串行化&a…

spingboot控制器中@Autowired的变量为空问题的解决

在控制器中新创建了一个函数&#xff0c;前台可以调用&#xff0c;然后获取记录信息返回。 但是前台调用时&#xff0c;可以进入该函数&#xff0c;但是该函数调用自动注入的变量时&#xff0c;发现该变量为空。但是其他函数都可以正常使用自动注入的变量&#xff0c;该问题就…

芯片后端的APR是指什么?

APR&#xff0c;代表自动布局与布线&#xff08;Auto Placement & Route&#xff09;&#xff0c;已经成为芯片后端设计的重要部分。在当今EDA&#xff08;电子设计自动化&#xff09;工具高度发展的背景下&#xff0c;手动摆放单元格并绘制连线已经变得不切实际。因此&…

如何在异步结果返回时进行跟踪

当我在使用多进程池时&#xff0c;可以通过apply_async()方法提交任务&#xff0c;并使用get()方法获取异步任务的结果。但是&#xff0c;在等待结果返回时&#xff0c;我们最希望能够跟踪任务的进度&#xff0c;以及处理已完成任务的结果。 然后针对这种问题我们最常见的方法…

如何在Spring Boot框架中打印响应的日志?

在 Spring Boot 框架中&#xff0c;可以使用拦截器来打印响应的日志。 通过自定义一个拦截器&#xff0c;可以在响应返回给客户端之前捕获响应信息&#xff0c;并将其记录到日志中。 以下是在 Spring Boot 框架中打印响应日志的步骤&#xff1a; 创建一个拦截器类&#xff0c…

国际数字影像产业园会议中心助力打造舒适高端的会议目的地

国际数字影像产业园会议中心&#xff0c;作为集先进技术与卓越设计于一体的现代化会议场所&#xff0c;正日益成为国内外高端会议活动的首选之地。其独特的建筑风格和内部设施&#xff0c;为与会者提供了舒适而高效的环境&#xff0c;让每一次大中小型会议都能达到预期的效果。…