日志系统设计
在项目开发中,完善的日志是排查问题的关键。利用 C/C++ 编译器预定义的宏,我们可以轻松获取当前代码的文件名和行号,从而精确定位日志来源。
__FILE__ 会被替换为当前源文件的字符串路径,__LINE__ 则对应行号整数。结合这两个宏,日志输出能明确显示 [文件名 : 行号],这对调试大型项目至关重要。
为了实现统一的日志格式,我们封装了一个打印函数。定义不同级别(正常、警告、调试、致命)后,只需一个宏即可调用。
#pragma once
#include <iostream>
#include <string>
#include <ctime>
#define NORMAL 1
#define WARNING 2
#define DEBUG 3
#define FATAL 4
// 宏展开后调用具体函数,自动传入文件信息和行号
#define LOG1(LEVEL, MESSAGE) log1(#LEVEL, MESSAGE, __FILE__, __LINE__)
void log1(std::string level, std::string message, std::string file, int line) {
std::cout << "[" << level << "]"
<< "[" << time(nullptr) << "]"
<< "[" << message << "]"
<< "[" << file << " : " << line << "]"
<< std::endl;
}
服务端入口逻辑
服务端主要负责加载数据、接收查询并返回结果。数据源存放在 data/raw_html/raw.txt,前端静态资源位于 ./wwwroot。
主循环中,我们需要持续接收用户的搜索关键字。这里有一个细节:为什么不用 cin?因为 cin 默认以空格为分隔符,一旦输入包含空格的短语就会截断。而 可以整行读取,更适合处理自然语言查询。


