审计日志
- Launchpad 条目:NovaSpec:audit-logging
- 创建: 2010-11-04
- 贡献者:termie, toddwilley
目录
总结
目前 Nova 中的日志记录主要针对调试,并且很大程度上依赖于人工阅读和解释输出,降低了任何分析的有效性。
本提案建议一种更正式和详细的日志记录系统,目标是机器可读性,具有以下子目标
- 性能分析
- 错误跟踪
- 系统使用情况统计
- 安全审计
还建议创建/使用日志分析工具,以基于这些新数据提供有用的信息,特别是最近开源的 Sawzall 工具集是一个不错的选择。
发布说明
在此版本中,日志记录变得更加详细,以提供活动集群的统计分析信息。 此外,还提供各种新的标志来禁用新型日志记录,并提供一些辅助工具来帮助获取更易于阅读的调试输出。
新的(不言自明)标志是
- --[no]rpc_performance_logging
- --[no]db_performance_logging
- --[no]exception_logging
- --[no]request_logging
新的辅助工具是
- bin/nova-log-format,提供自定义格式化的日志行,默认情况下为摘要输出
- bin/nova-log-expand,扩展日志行中的任何复杂对象,通常在您从日志中 grep 出您关心的行之后使用。
此外,还提供了以下日志分析脚本来处理集群的统计数据,有关用法和输出,请查看脚本本身
- tools/user_demographics.sh
- tools/load_graphs.sh
- tools/exception_counts.sh
- tools/performance_graphs.sh
原理
为了准确评估性能、使用情况并拥有用户采取的操作的审计跟踪,需要开始进行更详细的日志记录。
当前系统更多地依赖于直觉而不是硬数据,对于生产托管环境,直觉是不够的,我们需要了解我们实际的扩展特性并能够追踪安全漏洞。
日志记录并非全部故事,但它是能够管理事后信息并在一段时间内提供复杂分析的统计数据的关键部分。
用户故事
Johnny Slowqueries
- 利用率
- 负载峰值
- 调度霸凌者
...
Megan Managerpants
- 7 天活跃用户
- 最大的用户
- 每小时活动图
...
Sally Systems
- 停机后分析
- 未授权实例
- 崩溃实例
...
Danny Rollout
- 更新前后每秒的异常
- 滚动升级分布滞后
...
前提条件
- 日志轮换和/或集中存储/访问不在本文档的范围内。
- 日志记录开销不会导致性能显著下降。
设计
从最高层面来说,这是向日志中添加复杂数据,从较低层面来说,是对应用程序用于日志记录的过程的规范化。 在两者之间,这是在方法周围包装性能分析代码。
日志格式
为了简化兼容性,JSON 是一个不错的选择。 一些经验证据(http://blog.juma.me.uk/2009/03/25/json-serializationdeserialization-faster-than-protocol-buffers/)表明 JSON 在序列化速度方面与 protobufs 相当,虽然我不完全信任这些数字,但似乎可以合理地说,我们可以以与任何其他格式大致相同的速度转储到 JSON 以进行复杂数据。
常见的日志记录键将是
- 时间戳
- 上下文(请求上下文)
- 发起操作的用户
- 用户尝试发起的操作
- 当前服务
- 当前 rpc(这可能是上下文的一部分)
- 自由格式消息
- sys.exc_info
花时间按字母顺序排列键可能会使人们更容易制作快速的临时工具来获取他们想要的数据以进行一些临时查询想法。
日志记录过程
对于大多数“人工生成”语句,那些开发人员在日常工作中编写的仅包含开发人员消息的日志行,唯一的真正区别是在语句中包含“上下文”,甚至可以通过堆栈检查来推断。
一个自定义包装器,用于默认日志记录实用程序,该实用程序了解服务,以所需的日志格式输出,并在导入时提供一行样板,应该足以满足日常使用。
性能分析
机器生成的日志记录将使用相同的系统,但很少需要修改它,它将围绕系统的高层入口点进行包装,以对以下内容进行分析
- 整体调用性能,从发起 rpc 到返回需要多长时间
- 数据库性能,对于每个数据库层调用,返回需要多长时间
- 最高级别的未捕获异常
- 处理的请求
- 活动 X 的数量,其中 X 是 VM、网络配置等
实现
日志生成
输出日志的实现是直接的,并且主要是查找和替换任务,以确保每个模块都包含自定义日志记录包装器的样板,并且每次调用日志记录语句都包含额外的上下文信息。
目前,lp:~anso/nova/deploy 分支似乎已经处理了大部分内容。
从那里,需要配置日志输出以使用所需的日志格式,并将计时包装器放置在适当的入口点。
工具
这两个辅助工具很容易编写,nova-log-sformat 的格式字符串输入可以是简单的 python 格式化字符串( %(timestamp)s %(level)s %(message)s),并且 expander 基本上将是 prettyprint。
分析工具
这更棘手,可能需要等到日志记录实现之后再进行,但同样,建议使用 Sawzall 可能是值得学习的。
测试/演示计划
测试和演示基本上是在日志转储上运行工具,可能来自测试日志,但实际日志会更好,并记录一些示例输出。
未解决的问题
- 我们是否应该从堆栈中神奇地推断“上下文”?
BoF 议程和讨论
使用本节记录 BoF 期间的笔记;如果将其保留在批准的规范中,请用于总结讨论内容并记录任何被拒绝的选项。