C++小案例 - 日志实战

一.用到的知识

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

五.控制台测试:

相关推荐
星夜离尘561 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
码匠许师傅2 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
码匠许师傅3 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
bkspiderx3 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
小王C语言3 小时前
Qt常用控件:输入类控件,单行/多行输入框、下拉框、(日期)微调框、旋钮、滑动条
开发语言·qt
ESDWAN3 小时前
SD-WAN 主备切换为什么仍然会断网?从检测机制到会话恢复分析
开发语言·php
1001101_QIA4 小时前
.exe does not seem to be a Qt executable.
开发语言·qt
echome8884 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
云和数据.ChenGuang4 小时前
Python 单继承与多继承深度剖析:从 MRO 到实战取舍
开发语言·人工智能·python·langchain