0

我在我的应用程序中添加了日志记录功能,它运行良好。然而,在一种特殊情况下,它崩溃了,在这种情况下,我看不到日志。

看起来我的应用程序在保存日志文件之前崩溃了(我猜)。我可以强制 spdlog 保存文件吗?

4

2 回答 2

1

我相信最好的方法是实现内存映射文件接收器并使用它而不是文件接收器。原因是当应用程序将数据写入内存映射文件时,写入的数据可以立即读取到内核/其他应用程序,您不必刷新它。

我没有内存映射文件接收器的实现,但您可以从boost::ostream适配器开始boost::mapped_file并创建spdlog::ostream_sink_mt.

注意:请注意,每次文件已满时都应调整文件大小。

// https://stackoverflow.com/questions/33051067/c-boost-write-memory-mapped-file
// https://spdlog.docsforge.com/v1.x/4.sinks/#available-sinks

#include <spdlog/spdlog.h>
#include <spdlog/sinks/ostream_sink.h>

#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/iostreams/stream.hpp>

#include <vector>
#include <memory>

namespace bio = boost::iostreams;

int main() {
    using namespace std;
    vector<string> strArray(2000000);

    bio::mapped_file_params params;
    params.path          = "text.txt";
    params.new_file_size = 65536;
    params.flags         = bio::mapped_file::mapmode::readwrite;

    bio::stream<bio::mapped_file_sink> out(params);
    auto ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_mt> (out);
    auto logger = std::make_shared<spdlog::logger>("my_logger", ostream_sink);
    logger->info("Test message");
}

学分:

于 2022-02-21T13:16:44.827 回答
1

您可以调用该logger->flush()函数进行手动刷新。或者您可以使用my_logger->flush_on(spdlog::level::err)设置将触发自动刷新的最低日志级别。

于 2022-02-21T08:53:42.327 回答