ZeroErr
载入中...
搜索中...
未找到
日志(Logging)

日志是一组帮助你记录程序运行状态的宏。它可以记录你的程序运行时的状态,比如函数调用,变量值,错误信息等等。 所有的数据都会被写入到文件中。

LOG condition (when the log is enabled)

Severity Level

这里有五种Log等级: INFO, LOG, WARNING, ERROR, FATAL.

INFO等级的日志会在当前上下文中没有其他LOG, WARNING, ERROR, and FATAL时被丢弃。

注意:LOG FATAL 会导致程序终止

LOG Only

LOG_ONLY 可以让你只在某个函数,或者某个文件,或者某个模块中打印日志。

Trace

你可以使用info来打印一些信息,然后使用LOG宏来记录它们。这样可以构建更加完整的日志trace信息。

多线程与吞吐量

启用 ENABLE_THREAD_SAFE 时,多个线程可以向同一 LogStream 调用 LOG / WARN / ERR 等写入宏,同时由其他线程调用 flush()。 参数及时间戳在获取流锁前准备,完整记录在锁内发布;刷新也由同一把锁保护。 每个缓冲块约 64 KiB,文件输出按块合并写入,刷新后释放记录持有的参数。

高吞吐量场景可在启动工作线程之前配置:

stream.setFileLogger("app.log");
// 工作线程中:LOG("request {id}", stream, id);
// 所有工作线程退出后:
stream.flush();
LogStream is a class to manage the log messages.
定义 log.h:487
void setFlushWhenFull()
定义 log.h:604
void flush()
定义 log.cpp:133
void setFileLogger(zeroerr::String name, DirMode mode1=SINGLE_FILE, DirMode mode2=SINGLE_FILE, DirMode mode3=SINGLE_FILE)
定义 log.cpp:404

默认的逐条刷新保留及时输出行为,但每条日志都执行刷新,吞吐量较低。 按块刷新会延迟输出;手动刷新模式会持续保留记录,占用内存随日志量增长。 setAsyncLog() 当前没有后台写入实现,刷新仍在调用线程执行。

配置(包括回调与输出目标)应在工作线程启动前完成。遍历、查询以及低层 push() / log() 返回后手动填写 info 的接口需要调用方同步。 *_EVERY_* / *_FIRST* 限频宏的计数器也仍需外部同步。 INFO 上下文经共享 stderr 打印器输出时也需要外部同步。 use_lock_free 字段为源码兼容保留,写入统一使用流锁。 自定义格式化回调在持锁时执行,不应重新写入同一个流。

启用 BUILD_TEST 后,log_concurrency 验证 1/2/4/8 个写线程、三种刷新模式、 并发刷新、跨块及析构刷新时的记录完整性。以 log_concurrency benchmark 运行可测量简化格式化下的文件吞吐量(包含最终刷新,不启动额外刷新线程)。