ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

doxygen 内置 C++ 高性能日志库 spdlog 完全指南:从安装配置到源码级集成实践

doxygen 内置 C++ 高性能日志库 spdlog 完全指南:从安装配置到源码级集成实践 文档CLI开发工具【免费下载链接】doxygenOfficial doxygen git repository项目地址https://gitcode.com/gh_mirrors/do/doxygen点击查看免费下载导读本文以当前仓库 deps/spdlog/README.md 为技术主体系统讲解 doxygen 官方仓库所内置的 spdlog 日志库版本 1.15.3见 deps/spdlog/include/spdlog/version.h的安装方式、核心特性、十余种典型使用场景并深入其底层源码揭示 spdlog 在 doxygen 项目中如何被真实调用如 src/trace.h 中的 TRACE 宏与 src/trace.cpp 中的日志初始化流程。读完本文你将掌握如何在 doxygen 构建体系中启用或替换 spdlog、如何用 spdlog 的同步/异步日志器与各类 Sink 落地日志方案并理解其编译期/运行期双层级日志过滤、Backtrace 环形缓冲、多 Sink 分发等核心机制。一、spdlog 是什么doxygen 内置的快速 C 日志库spdlog 是一个以快著称的 C 日志库README 原文定位为Fast C logging library采用 MIT 许可。它之所以被 doxygen 官方仓库直接捆绑进deps/spdlog是因为 doxygen 的调试追踪tracing子系统需要一套轻量、线程安全、支持格式化占位符的高性能日志基础设施。在 doxygen 中spdlog 并非可选项而是默认依赖根 CMakeLists.txt 定义了use_sys_spdlog选项默认OFFdeps/CMakeLists.txt与 src/CMakeLists.txt 在未开启该选项时将仓库内置的 spdlog 通过add_subdirectory(spdlog)编入构建并把deps/spdlog/include加入头文件搜索路径。若系统已安装 spdlog可通过-Duse_sys_spdlogON改用系统库具体说明见 BUILD.txt。二、安装与集成方式2.1 Header-only 版本最简集成将include/spdlog即 deps/spdlog/include/spdlog目录复制到你的构建树中使用支持 C11 的编译器即可直接使用无需编译任何 .cpp 文件。这也是 doxygen 内置依赖能够零成本随主项目一起编译的原因之一。2.2 编译版推荐编译速度更快$ git clone https://github.com/gabime/spdlog.git $ cd spdlog mkdir build cd build $ cmake .. cmake --build .编译版将 spdlog 的核心实现编译进静态库避免每个翻译单元重复实例化模板显著缩短整体编译时间。doxygen 的构建正是采用这一形态——通过add_subdirectory编译deps/spdlog并由 src/CMakeLists.txt 链接spdlog::spdlog目标。2.3 包管理器安装面向已装好系统的环境若不想使用仓库捆绑版本README 列出了各主流平台包管理器的安装命令仓库内该节原文完整保留如下Debiansudo apt install libspdlog-devHomebrewbrew install spdlogMacPortssudo port install spdlogFreeBSDpkg install spdlogFedoradnf install spdlogGentooemerge dev-libs/spdlogArch Linuxpacman -S spdlogopenSUSEsudo zypper in spdlog-develALT Linuxapt-get install libspdlog-develvcpkgvcpkg install spdlogconanconan install --requiresspdlog/[*]condaconda install -c conda-forge spdlogbuild2depends: spdlog ^1.8.22.4 spdlog 自身的构建选项deps/spdlog/CMakeLists.txt依赖的 CMakeLists.txt 提供了若干关键选项可作为集成参考SPDLOG_BUILD_SHARED构建共享库默认 OFFdoxygen 使用静态链接SPDLOG_FMT_EXTERNAL使用外部 fmt 库替代捆绑版本SPDLOG_USE_STD_FORMAT使用 C20 的std::format替代 fmt会强制 C20 标准SPDLOG_NO_EXCEPTIONS以abort()替代异常SPDLOG_BUILD_TESTS/SPDLOG_BUILD_BENCH构建测试与基准程序。三、平台支持README 明确列出 spdlog 支持Linux、FreeBSD、OpenBSD、Solaris、AIXWindowsmsvc 2013、cygwinmacOSclang 3.5Android。这与 doxygen 多平台构建矩阵高度吻合。四、核心特性总览非常快见下文 Benchmarks 章节同时支持 Header-only 与编译两种形态基于 fmt 库的丰富格式化能力doxygen 捆绑版本使用deps/spdlog/include/spdlog/fmt/fmt.h聚合 fmt可选异步模式队列 后台线程自定义格式化与自定义日志模式pattern多线程/单线程日志器_mt/_st后缀多样化的日志目标Sink轮转Rotating文件每日Daily文件控制台支持颜色syslogWindows 事件日志Windows 调试器OutputDebugStringQt 控件带彩色高亮易于扩展的自定义 Sink日志过滤日志级别可在运行期与编译期分别调整支持从 argv 或环境变量加载日志级别Backtrace 支持将调试消息暂存于环形缓冲区按需转储。五、基础使用示例可直接编译运行以下所有示例均来自 deps/spdlog/README.md可直接复制验证#include spdlog/spdlog.h int main() { spdlog::info(Welcome to spdlog!); spdlog::error(Some error message with arg: {}, 1); spdlog::warn(Easy padding in numbers like {:08d}, 12); spdlog::critical(Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}, 42); spdlog::info(Support for floats {:03.2f}, 1.23456); spdlog::info(Positional args are {1} {0}.., too, supported); spdlog::info({:30}, left aligned); spdlog::set_level(spdlog::level::debug); // 设置全局日志级别为 debug spdlog::debug(This message should be displayed..); // 修改日志输出格式 spdlog::set_pattern([%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v); // 编译期日志级别 // 注意这不会改变当前运行期级别只会依据 SPDLOG_ACTIVE_LEVEL // 在 release 代码中移除相应日志调用。 SPDLOG_TRACE(Some trace message with param {}, 42); SPDLOG_DEBUG(Some debug message); }运行期 vs 编译期级别set_level在运行期决定哪些消息会被输出而SPDLOG_TRACE/SPDLOG_DEBUG等宏由SPDLOG_ACTIVE_LEVEL在编译期裁掉默认 logger 的宏调用完全不产生代码。doxygen 正是利用这一点见 src/trace.hDebug 构建下SPDLOG_ACTIVE_LEVEL被设为SPDLOG_LEVEL_TRACEENABLE_TRACING1Release 构建设为SPDLOG_LEVEL_INFO从而在发布版彻底消除 trace/debug 开销。六、日志器创建与常用 Sink 实战6.1 stdout/stderr 彩色日志器#include spdlog/spdlog.h #include spdlog/sinks/stdout_color_sinks.h void stdout_example() { // 创建彩色多线程日志器 auto console spdlog::stdout_color_mt(console); auto err_logger spdlog::stderr_color_mt(stderr); spdlog::get(console)-info(loggers can be retrieved from a global registry using the spdlog::get(logger_name)); }spdlog::get(name)可从全局注册表按名字取回已创建的日志器。_mt表示多线程安全null_mutex之外的互斥实现见 deps/spdlog/include/spdlog/details/null_mutex.h。6.2 基本文件日志器#include spdlog/sinks/basic_file_sink.h void basic_logfile_example() { try { auto logger spdlog::basic_logger_mt(basic_logger, logs/basic-log.txt); } catch (const spdlog::spdlog_ex ex) { std::cout Log init failed: ex.what() std::endl; } }文件打开失败如目录不存在时抛出spdlog::spdlog_ex务必捕获。doxygen 的initTracing正是基于basic_file_sink_mt把追踪日志写入文件见 src/trace.cpp。6.3 轮转Rotating文件日志器#include spdlog/sinks/rotating_file_sink.h void rotating_example() { // 创建单文件最大 5 MB、最多保留 3 个轮转文件的日志器 auto max_size 1048576 * 5; auto max_files 3; auto logger spdlog::rotating_logger_mt(some_logger_name, logs/rotating.txt, max_size, max_files); }文件达到max_size后自动轮转旧文件被重命名并受max_files数量限制。6.4 每日Daily文件日志器#include spdlog/sinks/daily_file_sink.h void daily_example() { // 创建每日日志器——每天凌晨 2:30 生成新文件 auto logger spdlog::daily_logger_mt(daily_logger, logs/daily.txt, 2, 30); }每日按固定时刻滚动文件适合长期运行的守护进程。6.5 Backtrace 支持环形缓冲暂存、按需转储// 调试消息可先暂存于环形缓冲而非立即落盘。 // 典型用途出错时才把最近一段调试日志转储出来。 spdlog::enable_backtrace(32); // 缓冲最近 32 条消息 // 或 my_logger-enable_backtrace(32).. for(int i 0; i 100; i) { spdlog::debug(Backtrace message {}, i); // 暂未输出 } // 假设此时发生了错误 spdlog::dump_backtrace(); // 现在把最近 32 条消息输出实现位于 deps/spdlog/include/spdlog/details/backtracer.h环形队列见 deps/spdlog/include/spdlog/details/circular_q.h该机制对故障现场追溯非常实用。6.6 周期性自动 flush// 每 3 秒冲刷所有已注册日志器 // 警告仅当所有日志器均为线程安全_mt 后缀时才可使用 spdlog::flush_every(std::chrono::seconds(3));该接口在 deps/spdlog/include/spdlog/spdlog.h 中通过details::registry::instance().flush_every(interval)实现内部会启动一个后台周期任务。6.7 秒表Stopwatch#include spdlog/stopwatch.h void stopwatch_example() { spdlog::stopwatch sw; spdlog::debug(Elapsed {}, sw); spdlog::debug(Elapsed {:.3}, sw); // 精确到 3 位小数 }头文件实现见 deps/spdlog/include/spdlog/stopwatch.h适合记录代码段耗时。6.8 十六进制输出二进制数据// 支持多种 std::containerchar 类型也支持迭代器区间。 // 格式标志 // {:X} - 大写输出 // {:s} - 字节间不加空格 // {:p} - 行首不输出位置信息 // {:n} - 不换行 // {:a} - 未设置 :n 时显示 ASCII #include spdlog/fmt/bin_to_hex.h void binary_example() { auto console spdlog::get(console); std::arraychar, 80 buf; console-info(Binary example: {}, spdlog::to_hex(buf)); console-info(Another binary example:{:n}, spdlog::to_hex(std::begin(buf), std::begin(buf) 10)); // 更多示例 // logger-info(uppercase: {:X}, spdlog::to_hex(buf)); // logger-info(uppercase, no delimiters: {:Xs}, spdlog::to_hex(buf)); // logger-info(uppercase, no delimiters, no position info: {:Xsp}, spdlog::to_hex(buf)); }该能力由 deps/spdlog/include/spdlog/fmt/bin_to_hex.h 提供适合网络报文、二进制协议调试。七、多 Sink 与异步模式7.1 多 Sink 日志器各 Sink 独立级别与格式// 创建具有 2 个目标、且目标级别和格式各异的日志器。 // 控制台只显示 warn 及以上文件则记录全部级别。 void multi_sink_example() { auto console_sink std::make_sharedspdlog::sinks::stdout_color_sink_mt(); console_sink-set_level(spdlog::level::warn); console_sink-set_pattern([multi_sink_example] [%^%l%$] %v); auto file_sink std::make_sharedspdlog::sinks::basic_file_sink_mt(logs/multisink.txt, true); file_sink-set_level(spdlog::level::trace); spdlog::logger logger(multi_sink, {console_sink, file_sink}); logger.set_level(spdlog::level::debug); logger.warn(this should appear in both console and file); logger.info(this message should not appear in the console, only in the file); }7.2 用户自定义回调日志事件通知// 为日志器挂接 lambda 回调每次写日志时回调都会被调用 void callback_example() { auto callback_sink std::make_sharedspdlog::sinks::callback_sink_mt([](const spdlog::details::log_msg msg) { // 例如在这里发送邮件通知自己 }); callback_sink-set_level(spdlog::level::err); auto console_sink std::make_sharedspdlog::sinks::stdout_color_sink_mt(); spdlog::logger logger(custom_callback_logger, {console_sink, callback_sink}); logger.info(some info log); logger.error(critical issue); // 会触发回调 }7.3 异步日志#include spdlog/async.h #include spdlog/sinks/basic_file_sink.h void async_example() { // 线程池参数可在创建异步日志器 *之前* 修改 // spdlog::init_thread_pool(8192, 1); // 队列 8k 条消息1 个后台线程 auto async_file spdlog::basic_logger_mtspdlog::async_factory(async_file_logger, logs/async_log.txt); // 等价写法 // auto async_file spdlog::create_asyncspdlog::sinks::basic_file_sink_mt(async_file_logger, logs/async_log.txt); }异步核心为mpmc_blocking_q.h有界多生产者多消费者队列与thread_pool.h详见 deps/spdlog/include/spdlog/details/mpmc_blocking_q.h 与 deps/spdlog/include/spdlog/details/thread_pool.h。7.4 异步多 Sink 组合#include spdlog/async.h #include spdlog/sinks/stdout_color_sinks.h #include spdlog/sinks/rotating_file_sink.h void multi_sink_example2() { spdlog::init_thread_pool(8192, 1); auto stdout_sink std::make_sharedspdlog::sinks::stdout_color_sink_mt (); auto rotating_sink std::make_sharedspdlog::sinks::rotating_file_sink_mt(mylog.txt, 1024*1024*10, 3); std::vectorspdlog::sink_ptr sinks {stdout_sink, rotating_sink}; auto logger std::make_sharedspdlog::async_logger(loggername, sinks.begin(), sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block); spdlog::register_logger(logger); }async_overflow_policy::block表示队列满时阻塞生产者保证消息不丢失另有overrun策略丢弃最旧消息保证吞吐见下文 Benchmarks 对比。八、扩展与定制8.1 用户自定义类型的格式化template struct fmt::formattermy_type : fmt::formatterstd::string { auto format(my_type my, format_context ctx) const - decltype(ctx.out()) { return fmt::format_to(ctx.out(), [my_type i{}], my.i); } }; void user_defined_example() { spdlog::info(user defined type: {}, my_type(14)); }8.2 自定义日志模式中的标志Custom flag// 日志模式可包含自定义标志。 // 下面的例子注册新标志 %*绑定到一个 my_formatter_flag 实例。 #include spdlog/pattern_formatter.h class my_formatter_flag : public spdlog::custom_flag_formatter { public: void format(const spdlog::details::log_msg , const std::tm , spdlog::memory_buf_t dest) override { std::string some_txt custom-flag; dest.append(some_txt.data(), some_txt.data() some_txt.size()); } std::unique_ptrcustom_flag_formatter clone() const override { return spdlog::details::make_uniquemy_formatter_flag(); } }; void custom_flags_example() { auto formatter std::make_uniquespdlog::pattern_formatter(); formatter-add_flagmy_formatter_flag(*).set_pattern([%n] [%*] [%^%l%$] %v); spdlog::set_formatter(std::move(formatter)); }8.3 自定义错误处理void err_handler_example() { // 可全局设置也可按日志器设置logger-set_error_handler(..) spdlog::set_error_handler([](const std::string msg) { spdlog::get(console)-error(*** LOGGER ERROR ***: {}, msg); }); spdlog::get(console)-info(some invalid message to trigger an error {}{}{}{}, 3); }8.4 syslog 输出#include spdlog/sinks/syslog_sink.h void syslog_example() { std::string ident spdlog-example; auto syslog_logger spdlog::syslog_logger_mt(syslog, ident, LOG_PID); syslog_logger-warn(This is warning that will end up in syslog.); }8.5 Android 日志#include spdlog/sinks/android_sink.h void android_example() { std::string tag spdlog-android; auto android_logger spdlog::android_logger_mt(android, tag); android_logger-critical(Use \adb shell logcat\ to view this message.); }8.6 从环境变量或 argv 加载日志级别#include spdlog/cfg/env.h int main (int argc, char *argv[]) { spdlog::cfg::load_env_levels(); // 或指定环境变量名 // MYAPP_LEVELinfo,myloggertrace ./example // spdlog::cfg::load_env_levels(MYAPP_LEVEL); // 或从命令行 // ./example SPDLOG_LEVELinfo,myloggertrace // #include spdlog/cfg/argv.h // 从 argv 加载级别 // spdlog::cfg::load_argv_levels(argc, argv); }随后在终端中$ export SPDLOG_LEVELinfo,myloggertrace $ ./example语法为级别[,日志器名级别...]可精细控制单个日志器无需重新编译。实现见 deps/spdlog/include/spdlog/cfg/env.h 与 deps/spdlog/include/spdlog/cfg/argv.h。8.7 文件打开/关闭事件回调// 可在日志文件打开/关闭前后获取回调适合清理工作或在文件首尾追加内容。 void file_events_example() { spdlog::file_event_handlers handlers; handlers.before_open [](spdlog::filename_t filename) { spdlog::info(Before opening {}, filename); }; handlers.after_open [](spdlog::filename_t filename, std::FILE *fstream) { fputs(After opening\n, fstream); }; handlers.before_close [](spdlog::filename_t filename, std::FILE *fstream) { fputs(Before closing\n, fstream); }; handlers.after_close [](spdlog::filename_t filename) { spdlog::info(After closing {}, filename); }; auto my_logger spdlog::basic_logger_st(some_logger, logs/events-sample.txt, true, handlers); }8.8 替换默认日志器void replace_default_logger_example() { auto new_logger spdlog::basic_logger_mt(new_default_logger, logs/new-default-log.txt, true); spdlog::set_default_logger(new_logger); spdlog::info(new logger log message); }8.9 Qt 控件彩色日志#include spdlog/spdlog.h #include spdlog/sinks/qt_sinks.h MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setMinimumSize(640, 480); auto log_widget new QTextEdit(this); setCentralWidget(log_widget); int max_lines 500; // 文本控件最多保留 500 行超出删除旧行 auto logger spdlog::qt_color_logger_mt(qt_logger, log_widget, max_lines); logger-info(Some info message); }8.10 Mapped Diagnostic ContextMDC// MDC 是保存在线程本地存储中的键值对字符串值映射。 // 每个线程维护自己的 MDC日志器将其作为诊断信息附加到日志输出。 // 注意由于依赖线程本地存储异步模式下不支持 MDC。 #include spdlog/mdc.h void mdc_example() { spdlog::mdc::put(key1, value1); spdlog::mdc::put(key2, value2); // 若使用自定义格式用 % 输出 MDC 数据 // spdlog::set_pattern([%H:%M:%S %z] [%^%L%$] [%] %v); }头文件实现见 deps/spdlog/include/spdlog/mdc.h。九、源码级视角spdlog 在 doxygen 中的真实集成除作为通用日志库使用外本仓库的独特价值在于 spdlog 已被 doxygen 深度接入其追踪子系统。以下证据均来自仓库源码9.1 编译期日志级别裁剪src/trace.hsrc/trace.h 是 doxygen 的追踪基础设施Debug 构建ENABLE_TRACING1下将SPDLOG_ACTIVE_LEVEL定义为SPDLOG_LEVEL_TRACERelease 构建下定义为SPDLOG_LEVEL_INFO隐藏 trace/debug 级别实现编译期裁剪用#pragma push_macro(warn)/#undef warn技巧避免 spdlog 头文件与自身宏冲突定义TRACE(...)宏调用SPDLOG_LOGGER_TRACE(g_tracer, ...)AutoTrace辅助类在构造/析构时分别输出与追踪消息结合spdlog::source_loc记录__FILE__/__LINE__/SPDLOG_FUNCTION并支持AUTO_TRACE_ADD/AUTO_TRACE_EXIT增量记录与退出信息——这是函数进出栈追踪的经典实现。9.2 运行期初始化与 Pattern 设置src/trace.cppsrc/trace.cpp 展示了 spdlog 多 Sink 与自定义 Pattern 的实际用法initTracing根据logFile参数stdout/stderr/普通文件路径分别创建stdout_sink_mt、stderr_sink_mt或basic_file_sink_mt将所有 Sink 组装进一个名为tracing的spdlog::logger并set_level(spdlog::level::trace)开启计时时使用 pattern[%C-%m-%d %T.%e][%t]%s:%# %v含日期、线程 ID、源文件行号、函数名否则使用%s:%# %vexitTracing调用spdlog::shutdown()优雅关闭所有后台线程并清理注册表。这套代码完整展示了创建 Sink → 组装 logger → 设置级别与 Pattern → 全局关闭的标准流水线可直接作为自定义日志系统的参考模板。9.3 构建集成CMake 层面deps/CMakeLists.txt 在NOT use_sys_spdlog时add_subdirectory(spdlog)src/CMakeLists.txt 将deps/spdlog/include加入头文件搜索路径根 CMakeLists.txt 与 BUILD.txt 中列出use_sys_spdlog选项允许以cmake -Duse_sys_spdlogON切换系统库。十、性能基准BenchmarksREADME 提供了在 Ubuntu 64 位、Intel i7-4770 CPU 3.40GHz 上的官方基准数据来源bench/bench.cpp同步模式[info] ************************************************************** [info] Single thread, 1,000,000 iterations [info] ************************************************************** [info] basic_st Elapsed: 0.17 secs 5,777,626/sec [info] rotating_st Elapsed: 0.18 secs 5,475,894/sec [info] daily_st Elapsed: 0.20 secs 5,062,659/sec [info] empty_logger Elapsed: 0.07 secs 14,127,300/sec [info] ************************************************************** [info] C-string (400 bytes). Single thread, 1,000,000 iterations [info] ************************************************************** [info] basic_st Elapsed: 0.41 secs 2,412,483/sec [info] rotating_st Elapsed: 0.72 secs 1,389,196/sec [info] daily_st Elapsed: 0.42 secs 2,393,298/sec [info] null_st Elapsed: 0.04 secs 27,446,957/sec [info] ************************************************************** [info] 10 threads, competing over the same logger object, 1,000,000 iterations [info] ************************************************************** [info] basic_mt Elapsed: 0.60 secs 1,659,613/sec [info] rotating_mt Elapsed: 0.62 secs 1,612,493/sec [info] daily_mt Elapsed: 0.61 secs 1,638,305/sec [info] null_mt Elapsed: 0.16 secs 6,272,758/sec异步模式[info] ------------------------------------------------- [info] Messages : 1,000,000 [info] Threads : 10 [info] Queue : 8,192 slots [info] Queue memory : 8,192 x 272 2,176 KB [info] ------------------------------------------------- [info] ********************************* [info] Queue Overflow Policy: block [info] ********************************* [info] Elapsed: 1.70784 secs 585,535/sec [info] Elapsed: 1.69805 secs 588,910/sec [info] Elapsed: 1.7026 secs 587,337/sec [info] ********************************* [info] Queue Overflow Policy: overrun [info] ********************************* [info] Elapsed: 0.372816 secs 2,682,285/sec [info] Elapsed: 0.379758 secs 2,592,255/sec [info] Elapsed: 0.373532 secs 2,677,147/sec可观察到的要点同步模式下单线程文件日志吞吐约 500 万条/秒10 线程竞争约 160 万条/秒异步block策略约 58 万条/秒保证不丢消息overrun策略约 260 万条/秒吞吐优先。这些数据表明追求消息不丢失选block追求极致吞吐且可容忍丢消息选overrun。十一、总结spdlog 在 doxygen 仓库中既是开箱即用的第三方依赖也是 doxygen 自身追踪系统的日志引擎。通过 deps/spdlog/README.md 可快速掌握其安装、平台、特性与全部使用模式通过 src/trace.h 与 src/trace.cpp 则可直接看到编译期级别裁剪、多 Sink 组装、自定义 Pattern、spdlog::shutdown()清理等最佳实践在真实项目中的落地。无论是为你的 C 项目引入日志能力还是希望理解 doxygen 内部追踪机制的实现细节本文提供的安装配置、代码示例与源码证据都可以直接参考复用。赞分享文档CLI开发工具【免费下载链接】doxygenOfficial doxygen git repository项目地址https://gitcode.com/gh_mirrors/do/doxygen点击查看免费下载相关推荐10个spdlog实战示例C高性能日志库完全指南10个spdlog实战示例C高性能日志库完全指南 spdlog是一个专为C设计的高性能日志库提供快速、灵活的日志记录解决方案。本文通过10个实用示例后端MagicalRecord 日志系统完全指南从日志级别配置到 CocoaLumberjack 集成MagicalRecord 日志系统完全指南从日志级别配置到 CocoaLumberjack 集成 MagicalRecord 在几乎所有与 Core Dat数据库Ray项目日志配置完全指南从基础到高级实践Ray项目日志配置完全指南从基础到高级实践 前言 在分布式计算框架Ray中日志系统是开发者进行问题诊断和性能监控的重要工具。本文将全面介绍Ray的日志配置机人工智能分布式训练强化学习任务调度模型推理服务后端上一篇kepler.gl Heatmap 密度热力图实战从 pandas 数据到独立 HTML 地图的完整配置指南下一篇如何突破网盘下载限制开源工具PanLinker的技术实现与应用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表