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

DieSnowK 2024-09-12 11:33:03 阅读 78

目录

0.前言1.实现一[Base]2.实现二[Pro]


0.前言

本篇给出两种日志设计形式

第一种较为简单,但较为直接,功能比较单一第二种相对复杂一些,但用起来类似于<code>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>

#define DEBUG 0

#define INFO 1

#define WARNING 2

#define ERROR 3

#define FATAL 4

void Log(std::string level, std::string msg, std::string file_name, int line)

{

#ifndef DEBUG_SHOW

if(level == "DEBUG")

{

return;

}

#endif

std::cout << "[" << level << "][" << time(nullptr) << "][" << msg \

<< "][" << file_name << "]["<< line << "]" << std::endl;

}


2.实现二[Pro]

该种实现使用了可变参数列表,使其用起来和printf()一样

#include <iostream>

#include <cstdarg>

#include <ctime>

// 日志是有日志级别的

#define DEBUG 0

#define NORMAL 1

#define WARNING 2

#define ERROR 3

#define FATAL 4

// 映射表

const char *gLevelMap[] =

{

"DEBUG",

"NORMAL",

"WARNING",

"ERROR",

"FATAL"

};

#define LOGFILE "./threadpool.log"

// 完整的日志功能,至少要包括:

// 日志等级 时间 支持用户自定义(日志内容 文件行 文件名)

void LogMessage(int level, const char *format, ...)

{

#ifndef DEBUG_SHOW

if(level == DEBUG)

{

return;

}

#endif

char 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);

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。