STTNet 0.7.0

Demo:文件与异步日志

展示文本文件操作、二进制安全复制和不依赖固定 sleep 的日志生命周期。

1. 示例内容

示例中的关键调用使用中文注释,并与仓库源码、CMake 目标和当前 API 保持一致。

2. 构建与运行

cmake --build build --target sttnet_file_logging --parallel
./build/examples/sttnet_file_logging

3. 运行结果

./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;
}