日志指南

Posted by 启示录 Blog on June 25, 2021

访问日志的格式:

源、目标IP、目标端口、用户名、程序名、资源对象(文件或目录)、传入或传出字节、时间

日志的记录机制:

  • 传输
  • 语法与格式
  • 事件分类学
  • 日志记录的设置、配置和建议

日志格式:

W3C 扩展日志文件格式

syslog

apache log

ArcSight公共事件格式

各种日志机制的优缺点

image

良好的日志记录标准

  • 发生了什么 What 适当的细节信息
  • 何时发生 When 开始时间和结束时间
  • 发生在何处 Where 哪台主机、什么文件系统、哪个网络接口
  • 谁参与其中 Who
  • 参与者来源 Where

日志的级别:debug、info、notice、warn、error、critical(临界条件)、alert、amergency

使用logrotate进行日志切割和压缩。使用syslog-ng进行syslog日志同步、匹配、处理.并且支持db日志解析、非结构文本、消息队列等日志解析。

日志挖掘

image

日志法则:

  • 收集法则:不要收集你从不计划使用的日志数据。不要收集觉得以后会使用的日志
  • 留存法则:只要觉得有可能用到,就尽可能长时间地留存日志数据,如果有法规规定,还应该保留更长的时间。
  • 监控法则:记录你所能记录的一切(尽可能多),但是只在你必须响应时发出的警报(尽可能少)。
  • 可用性法则:不要花费精力,将你的日志记录或监控系统的可用性提高到超过业务系统水平
  • 安全性法则:不要花费比保护业务数据更多的精力去保护你的日志数据。
  • 不断变化法则:日志记录、管理、分析领域中唯一不变的是日志来源、日志类型和日志消息都在变化。

日志错误

  • 不记录日志,甚至不知道日志是什么,等到想起来时一切已经太迟了。
  • 不查看日志数据,应定期查看日志数据。或者设置监控
  • 保存时间太短。在经济条件允许的情况下,尽可能时间长的保留日志。

常见的角色和职责:

image

工程师角色与职责

image

日志类型的基本原则

image

日志轮转机制

  • 使用日志轮转(logrotate)管理日志何时轮转,何时存档到某个外部存储位置
  • 应用程序本身负责处理日志轮转,这可以通过定制编写的应用程序代码,或者使用第三方日志记录库的内建功能。
  • 可以基于时间、大小、大小和时间

日志记录的坏习惯

image

who:日志的发起人

what:对象有助于指出受到影响的系统组件或者对象是什么

status:针对对象的操作是成功还是失败

where:系统、应用程序或者组件有助于回答何地的问题,必须提供相关应用程序的上下文。

from:对于和网络连接性或者分布式应用程序操作相关的消息,源有助于回答来自何处

time:时间戳和失去回答何时问题,时区对分布式应用不可或缺的,对于某些高容量系统还使用事务ID

reason:原因有助于回答“为什么”问题,这样日志分析就不需要深入地挖掘潜在的原因

operation:操作有助于回答“如何”的问题,他提供了事件的特性。

level:优先级有助于表明事件的重要性。

session_id:唯一的会话ID有助于集合不同线程和进程的相关信息

process_id/thread_id:关联运行应用程序以及日志记录

不应记录到日志中:

  • 密码(数据库,用户)
  • 社会安全号、身份证、学号
  • 生日、电话号码、全名、信用卡号码、驾驶证号码、基因信息、保险信息、任何类型的标示号码、生物计量学信息

日志级别

INFO、DEBUG、WARN、ERROR、FATAL。其中debug的日志可以通过参数打开或关闭。

image

INFO:用于记录常规处理消息和应用状态,譬如:初始化、关机、持久化资源分配。属于正常操作项。每个软件至少应该有以下几项:

  • 系统何时启动初始化
  • 何时变的可操作
  • 何时关闭
  • 终止之前的信息

日志实践清单

创建日志
  1. 使用标准并且配置简单的日志框架。譬如:log4j, log4net,zap 。 修改配置要比硬编码要快
  2. 使用具有灵活选项配置输出的框架。这样就能更好的集中注意力开发,不用写额外的日志插件
  3. 使用标准结构的数据格式:JSON。自定义的数据格式和文本不利于数据ETL分析。统一日志结构也利于阅读。
  4. 为数据字段添加标准的scheme,统一日志格式。
  5. 不要让日志阻塞应用程序正常运行;使用异步写日志
  6. 避免被vendor锁定(厂商陷阱)。不要直接使用标准库或者是包装器来保证可移植。
  7. 注意PaaS或基于容器的环境中的限制。譬如容器对主机syslog访问限制
  8. 不要忘记旧的应用程序日志。旧的应用程序也需要跟踪
  9. 尽可能全的提供此条日志的上下文,帮助使用者理解是如何产生的
  10. 使用日志级别区分日志
  11. 日志应注意是写主要的日志,不要累赘。日志的质量应和代码一样重要
  12. 给日志添加唯一标识符。(分布式链路跟踪,在大规模系统中很重要)
传输日志的最佳做法
  1. 使用可容错的协议。使用TCP或RELP协议代替UDP,毕竟UDP会丢包
  2. 发送失败自动重试。不可靠的协议和编写不正确的库可能会意外丢失日志。
  3. 日志支持本地存储,网络中断时也能保证不丢日志。同时可以缓轻服务端压力。好的日志收集agent支持本地存储队列
  4. 不要让日志应用程序用完所有的内存或者存储空间。(资源限制)
  5. 传输过程中使用数据加密(HTTPS)
  6. 传输前要过滤掉敏感数据(通过不记录敏感数据或者是,进行数据清洗)
  7. 日志发送时要裁剪为小日志,防止日志文件。日志发送应只发送增量数据,已经发送的不重复发送
  8. 监控是否有日志积压(Backlogs)(防止因为网络问题导致数据丢失)
  9. 配置代理和防火墙。检查syslog防火墙端口和路由配置,让可以访问网络
  10. 使用配置管理系统来管理日志应用。譬如使用Ansible, Puppet来管理大规模日志服务
日志管理
  1. 预先检查IT的安全要求,防止日志记录一些敏感信息

  2. 将日志存储在数据中心之外。(在停电和火灾期间,你可能也需要日志,将它们存储在其他可用区域)

  3. 比较自己维护,云托管和SaaS的服务。那种成本低或者可靠。开源不是免费,要考虑存储、计算、维护、带宽成本

  4. 在作出决定之前,先争取系统用户的同意。(让最终用户尝试这些选项,而不是做出自上而下的购买决定)

  5. 请记住,用户体验问题是破坏交易的因素(如果最终用户发现难以使用的工具,他们将避免使用该工具)

  6. 日志收集的延迟要尽量的小。实时日志(低延迟对于实时监控和故障排除很重要。)

  7. 尽量支持日志的复杂查询和查询性能。(小规模的日志查询测试是没有意义的,要多点日志测试)

  8. 何时自建或者云服务,优化查询性能(没有人希望性能降低。添加热/冷节点并优化分片大小和索引以提高速度。)

  9. 提取时自动解析日志。在搜索时解析日志特别的慢,自动规则比自定义规则节省时间

  10. 尽可能的可以继承到用户的工作流(workflow)中。可用性!=有效使用。用户需要理解它并使之适合他们的工作流程。

  11. 为您的团队设置常见的搜索,仪表板和警报。如果您的团队看到日志是有价值的,并且可以在此基础上继续发展,那么更容易从您的团队获得支持。

  12. 日志的核心是指标。指标是属性在特定时间内的特定值,通常以固定间隔进行测量。

    • Timer-测量某些程序花费的时间(例如您的网络服务器响应时间)
    • Meter-衡量事件发生率(例如,您网站的访问者比率)
    • Counter-记录数量(例如:访问用户数)
    • Gauge - 定时记录使用率。 譬如CPU