文章摘要
在处理大量事件时,建议采用基于时间的日志记录方式,即每隔固定时间记录一次日志,而不是基于事件数量。这种方式可以保持日志记录的频率一致,避免因日志过多而影响系统性能。基于时间的日志记录能够更有效地监控系统状态,确保日志不会成为性能瓶颈。
文章总结
标题:按时间而非数量记录日志
在软件工程中,“如何记录日志”是一个颇具深度的话题,存在多种不同的观点,且这些观点在不同情境下几乎都是有效的。本文将提出一个观点:在处理大量事件时,最好每隔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条消息。在这两种情况下,你都应以恒定的速率记录日志,而基于时间的日志记录方式正好能满足这一需求。
评论总结
评论内容总结:
日志与指标的区别
- 主要观点:日志和指标应分开处理,日志记录异常情况,指标用于系统性能监控。
- 论据:
- AdieuToLogic: "Log interesting things, where interesting is defined as context outside what the 'happy path' execution performs."
- sethammons: "Log errors, metric successes."
日志的挑战与最佳实践
- 主要观点:日志记录需要平衡信息量和资源消耗,避免过多或过少。
- 论据:
- 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."
日志格式与工具
- 主要观点:使用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."
日志记录策略
- 主要观点:根据应用场景选择按时间或按数量记录日志,各有优缺点。
- 论据:
- 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."
日志的实用建议
- 主要观点:记录关键逻辑分支、请求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."
日志与健康检查
- 主要观点:不应依赖日志来判断应用健康状态,应使用专门的健康检查端点。
- 论据:
- Bleibeidl: "Provide an endpoint which presents health information and use infrastructure-level metrics."
总结:评论普遍认为日志和指标应分开处理,日志记录需要平衡信息量和资源消耗,使用JSON格式和日志聚合工具可以提高效率,同时应根据应用场景选择合适的日志记录策略。