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>
#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);
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » [项目][WebServer][日志设计]详细讲解
发表评论 取消回复