一.用到的知识
if、switch分支语句,枚举变量,字符串类型变量,main函数传参。
二.什么是日志?
日志就是程序在运行过程中自动记录"发生了什么"的文字账本,用来排错、监控和追溯问题。
| 场景 | 日志 |
|---|---|
| 飞机上的黑匣子 | 记录飞行数据,出事时用来查原因 |
| 银行流水账单 | 记录每笔交易,对账、查异常 |
| 小区门禁记录 | 谁几点几分进了哪栋楼 |
| 你手机里的通话记录 | 谁什么时候打给你、打了多久 |
三.程序的整体功能
程序接收命令行参数(如 info、error),决定最低显示哪个级别的日志,然后依次"产生"4 条不同级别的日志,只有级别 ≥ 设置值的日志才会被打印。
级别:DEBUG < INFO < ERROR < FATAL
四.代码拆解
1.头文件
#include <iostream> // 输入输出流,提供 cout / endl
#include <string> // 字符串类 string
using namespace std; // 省略 std:: 前缀(新手友好,但大项目不推荐)
2.枚举定义日志
enum class LogLevel
{
DEBUG,
INFO,
ERROR,
FATAL
};
3 .入口和条件判断
int main(int argc, char* argv[])
{
//用户传递日志的最低显示级别
//debug < info < error < fatal
auto logLevel = LogLevel::DEBUG;
if (argc > 1)
{
string levelstr = argv[1];
if ("info" == levelstr)
{
logLevel = LogLevel::INFO;
}
else if ("error" == levelstr)
{
logLevel = LogLevel::ERROR;
}
else if ("fatal" == levelstr)
{
logLevel = LogLevel::FATAL;
}
}
4.测试:
//测试日志1 debug
{
auto level = LogLevel::DEBUG;
string context = "test log 1";
if (level >= logLevel)
{
string levelstr = "Debug";
switch (level)
{
case LogLevel::INFO:
levelstr = "Info"; break;
case LogLevel::ERROR:
levelstr = "Error"; break;
case LogLevel::FATAL:
levelstr = "Fatal"; break;
}
cout << levelstr << ":" << context << endl;
}
}
//测试日志2 info
{
auto level = LogLevel::INFO;
string context = "test log 2";
if (level >= logLevel)
{
string levelstr = "Debug";
switch (level)
{
case LogLevel::INFO:
levelstr = "Info"; break;
case LogLevel::ERROR:
levelstr = "Error"; break;
case LogLevel::FATAL:
levelstr = "Fatal"; break;
}
cout << levelstr << ":" << context << endl;
}
}
//测试日志3 error
{
auto level = LogLevel::ERROR;
string context = "test log 3";
if (level >= logLevel)
{
string levelstr = "Debug";
switch (level)
{
case LogLevel::INFO:
levelstr = "Info"; break;
case LogLevel::ERROR:
levelstr = "Error"; break;
case LogLevel::FATAL:
levelstr = "Fatal"; break;
}
cout << levelstr << ":" << context << endl;
}
}
//测试日志4 fatal
{
auto level = LogLevel::FATAL;
string context = "test log 4";
if (level >= logLevel)
{
string levelstr = "Debug";
switch (level)
{
case LogLevel::INFO:
levelstr = "Info"; break;
case LogLevel::ERROR:
levelstr = "Error"; break;
case LogLevel::FATAL:
levelstr = "Fatal"; break;
}
cout << levelstr << ":" << context << endl;
}
}
打印结果:
| 块 | level | context |
|---|---|---|
| 1 | DEBUG | test log 1 |
| 2 | INFO | test log 2 |
| 3 | ERROR | test log 3 |
| 4 | FATAL | test log 4 |
五.控制台测试:
