c++ 宏定义日志输出

这篇博客展示了在Linux环境下如何使用C++的宏定义创建自定义的日志记录功能。通过`my_log`和`print_log`两个宏,实现了时间戳、文件名、行号和函数名等信息的打印,方便调试和问题排查。在`test`函数和`main`函数中调用了这些宏,演示了其实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下在linux下测试有效

#include <stdio.h>
#include <time.h>
#include <chrono>
using namespace std;

static const char* tag = "main";
static const char tag_debug = 1;
static const char tag_user_milli_sec = 0;

#define LOG (printf("%s (%d) - <%s>\n",__FILE__,__LINE__,__FUNCTION__),printf)

#define my_log(format, ...)\
do{\
    time_t time_val=time(NULL);\
    char* ctr = ctime(&time_val);\
    ctr[24] = '\0';\
    printf("[%s] %s (%d) - <%s> : "#format " \n", ctr, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}while(0)

#define print_log(format, ...) \
do{ \
    if(tag_debug == 1){\
        if(tag_user_milli_sec == 1){\
            static struct timespec ts;\
            clock_gettime(CLOCK_REALTIME, &ts);\
            printf("%ld:%d : %s : %d D:"#format " \n", ts.tv_sec,ts.tv_nsec/(1000*1000), tag, __LINE__, ##__VA_ARGS__); \
        }\
        else {\
            time_t time_val=time(NULL);\
            char* ctr = ctime(&time_val);\
            ctr[24] = '\0';\
            printf("%s : %s : %d D:"#format " \n", ctr, tag, __LINE__, ##__VA_ARGS__); \
        }\
    } \
}while(0)

 
void test(){
    my_log("what's this %d",120);
	LOG;
}
int main(){
    my_log("what's this");

	test();
	LOG;
	return 0;
}
### 关于C++宏定义 `EASYLOG` 和 `EASYLOGDEBUG` 的实现细节 在C++中,是一种预处理指令,通常用于简化代码编写过程中的重复逻辑。对于日志库而言,可以用来封装复杂的日志记录逻辑,使得开发者能够以简洁的方式调用日志功能。 #### 1. **`EASYLOG` 的实现** `EASYLOG` 是一个典型的日志,其目的是为了方便用户通过指定的日志级别来记录消息。以下是可能的实现方式: ```cpp #define EASYLOG(logger, level, format, ...) \ do { \ if ((logger)->isLevelEnabled(level)) { \ (logger)->log(level, __FILE__, __LINE__, format, ##__VA_ARGS__); \ } \ } while (0) ``` - 这里的 `do { ... } while(0)` 结构是为了确保即使在复杂语境下(比如作为条件分支的一部分),也能正常工作[^3]。 - `(logger)->isLevelEnabled(level)` 检查当前日志级别是否允许记录该条日志。 - 如果允许,则调用 `(logger)->log(...)` 方法实际记录日志,传递文件名、行号以及格式化字符串等信息。 - 使用 `##__VA_ARGS__` 可以支持可变参数列表,并且当没有额外参数时不会报错。 #### 2. **`EASYLOGDEBUG` 的实现** `EASYLOGDEBUG` 通常是专门为调试目的设计的一种日志,在生产环境中可能会被禁用或者忽略掉。其实现如下所示: ```cpp #ifdef DEBUG_MODE #define EASYLOGDEBUG(logger, format, ...) \ EASYLOG((logger), DEBUG_LEVEL, "[DEBUG] " format "\n", ##__VA_ARGS__) #else #define EASYLOGDEBUG(logger, format, ...) #endif ``` - 当编译选项启用了 `DEBUG_MODE` 时,`EASYLOGDEBUG` 将会按照 `DEBUG_LEVEL` 记录带有 `[DEBUG]` 前缀的消息[^4]。 - 否则,如果未启用调试模式,则整个会被替换为空白内容,从而避免任何性能开销。 #### 3. **结合 EasyLog 库的具体应用** 假设我们已经有一个名为 `logger` 的共享指针实例指向了一个 `EasyLog` 对象,那么可以通过以下方式分别使用这两个: ```cpp shared_ptr<EasyLog> logger = LogFactory::instance()->getEasylog("SampleLogger", "./"); // 正常日志记录 EASYLOG(logger, INFO, "This is an info message with value %d.", 42); // 调试日志记录 EASYLOGDEBUG(logger, "Debugging variable: %f", 3.14); ``` 以上代码片段展示了如何利用这些快速向应用程序添加结构化的日志输出能力[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值