0


[项目][WebServer][日志设计]详细讲解

目录


0.前言

  • 本篇给出两种日志设计形式 - 第一种较为简单,但较为直接,功能比较单一- 第二种相对复杂一些,但用起来类似于printf,功能更灵活些
  • 注意:两种实现中,都是用了条件编译,以便屏蔽或观察调试信息

1.实现一[Base]

  • 说明:- 日志是需要日志等级的,所以用宏来区别等级- 一般日志需要以下内容 - 日志等级- 日志输出内容- 所在文件、所在行,以便排错
  • void Log(string level, string msg, string file_name, int line),函数参数过多,每次调用都要手动输入__FILE__ __LINE__,为了简化使用,做以下处理 - 用宏代替函数,减少固定的传参输入 —> file_name && line- 但是level是int类型,无法传给string - **#**可以把一个宏参数变成对应的字符串- #define LOG(level, msg) Log(#level, msg, __FILE__, __LINE__)
#include<iostream>#include<string>#include<ctime>#defineDEBUG0#defineINFO1#defineWARNING2#defineERROR3#defineFATAL4voidLog(std::string level, std::string msg, std::string file_name,int line){#ifndefDEBUG_SHOWif(level =="DEBUG"){return;}#endif
    std::cout <<"["<< level <<"]["<<time(nullptr)<<"]["<< msg \
            <<"]["<< file_name <<"]["<< line <<"]"<< std::endl;}

2.实现二[Pro]

  • 该种实现使用了可变参数列表,使其用起来和printf()一样
#include<iostream>#include<cstdarg>#include<ctime>// 日志是有日志级别的#defineDEBUG0#defineNORMAL1#defineWARNING2#defineERROR3#defineFATAL4// 映射表constchar*gLevelMap[]={"DEBUG","NORMAL","WARNING","ERROR","FATAL"};#defineLOGFILE"./threadpool.log"// 完整的日志功能,至少要包括:// 日志等级 时间 支持用户自定义(日志内容 文件行 文件名)voidLogMessage(int level,constchar*format,...){#ifndefDEBUG_SHOWif(level == DEBUG){return;}#endifchar stdBuffer[1024];// 标准部分
    time_t timestamp =time(nullptr);snprintf(stdBuffer,sizeof stdBuffer,"[%s] [%ld]", gLevelMap[level], timestamp);char logBuffer[1024];// 自定义部分
    va_list args;va_start(args, format);vsnprintf(logBuffer,sizeof logBuffer, format, args);va_end(args);printf("%s %s\n", stdBuffer, logBuffer);}
标签: C++ 开发语言 linux

本文转载自: https://blog.csdn.net/qq_37281656/article/details/142110513
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。

“[项目][WebServer][日志设计]详细讲解”的评论:

还没有评论