int size = 10 * 1024 * 1024; // 10M
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
//auto console_sink = std::make_shared<spdlog::sinks::msvc_sink_mt>();
console_sink->set_level(spdlog::level::debug);
auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("logs/log.txt", size, 360, true);
file_sink->set_level(spdlog::level::debug);
auto baseSinkViewModel = std::make_shared<BaseSinkViewModel>();
spdlog::sinks_init_list sinks { console_sink, file_sink, baseSinkViewModel };
auto logger = std::make_shared<spdlog::logger>("global logger", sinks);
logger->set_level(spdlog::level::debug); //设置等级
logger->flush_on(spdlog::level::debug); //刷新
spdlog::flush_every(std::chrono::seconds(3)); //刷新时间
spdlog::set_default_logger(logger);
上述代码说明
msvc_sink_mt 用于vs终端生成debug信息,但是在安卓上不能使用,替代品为stdout_color_sink_mt
rotating_file_sink_mt写入文本
BaseSinkViewModel 是我自己写的类,继承了base_sink 用于把打印的日志通过信号槽的方式传到QML,下面是代码
class BaseSinkViewModel : public QObject,public spdlog::sinks::base_sink<std::mutex> {
Q_OBJECT
Q_PROPERTY(QVariantList logInfoList READ logInfoList NOTIFY logInfoListChanged)
public:
BaseSinkViewModel(QObject* parent = nullptr);
~BaseSinkViewModel() override;
QVariantList logInfoList() const;
signals:
void logInfoListChanged();
protected:
void sink_it_(const spdlog::details::log_msg& msg) override;
void flush_() override;
private:
QVariantList m_logInfoList;
void processLogMessage(const spdlog::details::log_msg& msg);
};
BaseSinkViewModel::BaseSinkViewModel(QObject* parent)
: QObject(parent)
{
}
BaseSinkViewModel::~BaseSinkViewModel()
{
}
QVariantList BaseSinkViewModel::logInfoList() const
{
return m_logInfoList;
}
void BaseSinkViewModel::sink_it_(const spdlog::details::log_msg& msg)
{
processLogMessage(msg);
}
void BaseSinkViewModel::flush_()
{
}
void BaseSinkViewModel::processLogMessage(const spdlog::details::log_msg& msg)
{
m_logInfoList.append(QString(QLatin1String(msg.payload.data())));
emit logInfoListChanged();
}
注册方式 qmlRegisterSingletonInstance(“BaseSinkViewModel”, 1, 0, “BaseSinkViewModel”, baseSinkViewModel.get());
spdlog使用介绍
只需要在main函数中添加最上面的代码就可以全局使用了,BaseSinkViewModel用不到的话删除就可以了