在大型工程项目中,完善的日志系统是排查问题的基石。Server 部分则是各类功能模块的最终落地场景。
日志系统实现
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;
}
Server 端逻辑
Server 入口位于 server.cc。数据源通常存放在 data/raw_html/raw.txt,前端静态资源则置于 ./wwwroot/。程序启动后实例化 Searcher 类并初始化索引。
在用户交互环节,这里有一个关键的选择:为什么用 fgets 而不是 ?因为 默认遇到空格就会停止读取,这对于多词搜索是不友好的。 能完整读取一行输入,包括空格。


