Demo:文件与异步日志
展示文本文件操作、二进制安全复制和不依赖固定 sleep 的日志生命周期。
1. 示例内容
示例中的关键调用使用中文注释,并与仓库源码、CMake 目标和当前 API 保持一致。
2. 构建与运行
cmake --build build --target sttnet_file_logging --parallel
./build/examples/sttnet_file_logging3. 运行结果
./build/examples/sttnet_file_logging预期:创建配置文件及其副本;输出配置内容和丢弃日志计数;日志对象析构前排空已入队记录。
4. 完整源码
#include <sttnet.h>
#include <iostream>
int main()
{
using stt::file::File;
using stt::file::FileTool;
using stt::file::LogFile;
// createDir() 创建失败时返回 false;目录已经存在时也可能返回 false,
// 业务需要区分原因时应额外检查路径状态。
(void)FileTool::createDir("runtime");
// File 提供线程安全的文本和二进制操作。API 允许创建文件时,openFile()
// 也会创建缺失的父目录。
File config;
if(!config.openFile("runtime/example.conf"))
return 1;
config.deleteAll();
config.appendLine("port=8080");
config.appendLine("workers=4");
std::string all;
config.readAll(all);
std::cout << "configuration:\n" << all << '\n';
config.closeFile();
// FileTool::copy() 按原始字节复制。源文件或目标文件无法打开,或者
// 写入没有完整完成时返回 false。
if(!FileTool::copy("runtime/example.conf","runtime/example.conf.copy"))
return 2;
// LogFile 内部使用有界异步队列;日志对象的生命周期覆盖所有生产者线程
// 停止之后;析构函数会在线程退出前排空已经进入队列的记录。
// 固定时长 sleep 不能替代明确的生命周期管理。
{
LogFile log(8192);
if(!log.openFile("runtime/example.log"))
return 3;
log.writeLog("service started");
log.writeLog("configuration loaded");
std::cout << "dropped logs: " << log.getDroppedLogCount() << '\n';
}
return 0;
}