Hacker News 中文摘要

RSS订阅

按时间记录,而非按次数 -- Log by time, not by count

文章摘要

在处理大量事件时,建议采用基于时间的日志记录方式,即每隔固定时间记录一次日志,而不是基于事件数量。这种方式可以保持日志记录的频率一致,避免因日志过多而影响系统性能。基于时间的日志记录能够更有效地监控系统状态,确保日志不会成为性能瓶颈。

文章总结

标题:按时间而非数量记录日志

在软件工程中,“如何记录日志”是一个颇具深度的话题,存在多种不同的观点,且这些观点在不同情境下几乎都是有效的。本文将提出一个观点:在处理大量事件时,最好每隔X秒记录一次日志,而不是每处理X条消息就记录一次。这一概念虽然简单,但此前似乎并未被明确记录。

让我们通过一些伪代码来理解这一观点。

基于数量的日志记录

```python numeventsprocessed = 0

while True: event = readeventfromqueue() processevent(event) numeventsprocessed += 1

if num_events_processed % 1_000 == 0:
    module_logger.info("已处理1000条事件。")

```

基于时间的日志记录

```python lasttimelogged = time.time() numeventsprocessedsincelast_log = 0

while True: event = readeventfromqueue() processevent(event) numeventsprocessedsincelast_log += 1

current_time = time.time()
if current_time - last_time_logged >= 1.0:
    module_logger.info(f"已处理{num_events_processed_since_last_log}条事件。")
    num_events_processed_since_last_log = 0
    last_time_logged = current_time

```

默认情况下,建议采用基于时间的日志记录方式。

日志记录频率应保持一致

如果记录日志过于频繁:

  • 记录日志的时间会占用处理事件的时间,导致系统在高峰负载时变慢。
  • 大量无用的日志会增加存储和处理的成本。
  • 大量无用的日志会降低日志搜索的效率,从而降低系统的可观察性。

如果记录日志不够频繁:

  • 你可能无法确定应用程序是否在正常运行。
  • 系统的可观察性会降低。

基于数量的日志记录的问题在于,很难找到一个合适的X值。你的应用程序在生产环境中可能每秒处理数百万条消息,而在本地测试时可能每秒只处理约5条消息。在这两种情况下,你都应以恒定的速率记录日志,而基于时间的日志记录方式正好能满足这一需求。

评论总结

评论内容总结:

  1. 日志与指标的区别

    • 主要观点:日志和指标应分开处理,日志记录异常情况,指标用于系统性能监控。
    • 论据:
      • AdieuToLogic: "Log interesting things, where interesting is defined as context outside what the 'happy path' execution performs."
      • sethammons: "Log errors, metric successes."
  2. 日志的挑战与最佳实践

    • 主要观点:日志记录需要平衡信息量和资源消耗,避免过多或过少。
    • 论据:
      • perching_aix: "There's a tendency to either log too much or log too little."
      • ledauphin: "Logging per time interval can be a very handy approach."
  3. 日志格式与工具

    • 主要观点:使用JSON格式和日志聚合工具可以提高日志的可读性和搜索效率。
    • 论据:
      • haiku2077: "If your logs are usually read in a log aggregator like Splunk or Grafana, log as JSON objects."
      • perching_aix: "Most everything now logs in JSON lines at least."
  4. 日志记录策略

    • 主要观点:根据应用场景选择按时间或按数量记录日志,各有优缺点。
    • 论据:
      • pjz: "Logging 'by count' used a bounded amount of memory."
      • ledauphin: "Calculate in real time how often things are happening and then log the number of things that have happened."
  5. 日志的实用建议

    • 主要观点:记录关键逻辑分支、请求ID,并支持动态调整日志级别。
    • 论据:
      • haiku2077: "Log all major logical branches within code, include request ID in all so logs can be grouped."
      • kqr: "Log absolute total counts of received and finished events."
  6. 日志与健康检查

    • 主要观点:不应依赖日志来判断应用健康状态,应使用专门的健康检查端点。
    • 论据:
      • Bleibeidl: "Provide an endpoint which presents health information and use infrastructure-level metrics."

总结:评论普遍认为日志和指标应分开处理,日志记录需要平衡信息量和资源消耗,使用JSON格式和日志聚合工具可以提高效率,同时应根据应用场景选择合适的日志记录策略。