高流量下,日志要不要采样
每秒几千请求的服务,每个请求打两行 info 日志,一天就是几亿行。磁盘扛不住,grep 也扛不住。
采样的原则:**错误全留,正常按比例**。
if (level >= WARN || rand() % 100 == 0) { log(...) }
但随机采样会破坏“同一请求的日志能串起来”。更好的做法是按 request_id 哈希取模,保证同一个请求要么全记要么全不记;或者按时间窗口采样,整秒整分地开关。
还有一种常见需求是“慢请求全留”:
if (duration > 500ms || level >= WARN) { log(...) }
这比均匀采样有用得多——出问题时你要看的是异常样本,不是随机样本。