日志系统

概述

参考:

背景

在系统上,不管是系统本身还是外部程序,在开始、运行、结束的一整套过程中,都会产生信息,这些信息包括:何时、何地(e.g. 来源 IP)、何物(e.g. 什么程序)、发生了什么事情等。i.e. 记录系统在什么时候由哪个程序做了什么样的行为时,发生了何种事件等等。而发生的事情又有等级的区别,哪些信息是危险的,哪些信息是标准可以不用关注的等。这些信息就统称为 Log(日志)

随着时代发展,操作系统、程序、硬件设备等等都会产生日志,如此众多的日志需要一个标准来进行定义,这个日志标准就是 Syslog Protocol,由 IETF 给定的 RFC 5424 规范来执行。而在 IT 行业,一般也把各个事务所生成的日志称为 syslog。

日志的生成

操作系统、进程和应用程序的编写者完全清楚他们将生成的事件。在某些情况下,生成消息用来说明状态。可以是一段时间一次,也可以由其他方式触发,例如在程序退出时。在其他情况下,消息是由遇到的条件产生的。在这些情况下,不管是状态消息或者包含一些类型的警告都可能被产生。操作系统、进程和应用程序的编写者可能会在详单中确定消息的数量。这些详单中通常包括发出消息的设备,同时包含消息的严重级别。这样,操作员可以有选择地筛选消息,可以更快的定位更加重要的和有处理时间限制的消息,同时可以将状态或消息信息放在文件中,将来阅读他们。其他显示和保存信息的方式也可以存在。

必须在设备中配置一些规则,这些规则可以告诉设备显示还是转发事件消息。这些规则是十分灵活的。管理员可能希望所有的信息都保存在本地,同时所有高优先级的消息都会转发到另一台设备中。他们可能发现,将某些设备的信息发送到一些或所有用户的设备中,同时显示在系统控制台上是很合适的。然而,管理员决定将事件信息发送到 syslog 采集器中,在采集器中包含了组成设备的信息以及发送的严重级别,同时定义了远程接收器。例如,系统管理员可能想让所有由邮件设备发出的消息被转发到一个特定的事件信息采集器中。管理员还可以让所有内核生成的事件信息被发送到另一台 syslog 接收器中,同时,将内核产生的 critical 严重级别的消息发送到第三台设备中。同时,将显示在系统控制台中的信息 email 给部分用户,同时将他们保存在设备本地磁盘的文件中。反之,可以将本地进程产生的消息显示在控制台中,但不保存也不转发。所有事件的规则都在设备中生成。因为管理员知道 collector 会收集到哪种类型的事件,他们会在 syslog 服务器中配置相应的规则。

消息的内容因创建者而异。建议将消息按照一定格式编写,这样人们就可以阅读他们。在消息中加入时间戳和发出消息的设备以及进程的标识符是一个很好的建议。但他们都不是必须的。

假设任何进程和设备都有可能产生事件消息。可能包含没有任何本地存储空间的设备,例如打印机、路由器、集线器、交换机以及无盘工作站。在这种情况下,将事件消息传送到 collector 可能是必要的,以便操作者可以记录并希望看到它们。

日志的收集

日志收集起来,才能方便管理人员进行查看并进行故障排除。如此众多事物的日志如果想要统一管理,就需要一套程序来对所有事物的日志进行收集、处理、保存、过滤、分析等,可以实现该功能的程序有以下几个:

  • sysLog 程序与 syslog 标准重名,是早期的 Linux 用于处理系统上所有事物日志的程序
  • RsysLog 是 sysLog 的升级版
  • ELK/EFK 是很重量级,功能很全的 3 款程序的统称
    • Eleasticsearch 是一个存储系统和搜索引擎
    • logstash、Fluentd 日志收集
    • kibana 日志的前端展示

日志的生成与收集的通用流程

当一个程序生成日志后,一般调用一个 output() 函数,把生成的日志输出到某处,e.g.文件、内存、STDOUT 等

而日志采集程序一般会调用一个 input() 函数,来从某处获取日志,然后再调用 output() 函数来把日志转发或转存

The Syslog Protocol(系统日志协议) - 即 syslog 规范

每个程序如果产生的日志格式都不一样,也不便于收集归档,更不便于分类查看,所以需要一个统的规范,这个规范包括可收集哪些程序的日志、日志的格式、级别的定义等

架构

Syslog Protocol 采用分层架构设计,共分为 3 层

  • “syslog content” syslog 内容层。is the management information contained in a syslog message.
  • “syslog application"syslog 应用程序层。处理系统日志消息的生成、解释、路由、存储
  • “syslog transport"syslog 传输层。将消息放到 puts messages on the wire and takes them off the wire.

每层架构中都会执行某些类型的功能

  • originator:发起者。生成将要在消息中携带的 syslog 内容
  • collector:采集器。收集 syslog 内容以供进一步分析
  • relay:中继。转发消息,接收来自 originators 或其他 relaysd 的消息,并将其发送给 collectors 或其他 relays
  • transport sender:传输发送器。将 syslog 消息传递给特定的传输协议
  • transport receiver:传输接收器。从特定的传输协议获取 syslog 消息

syslog 信息的构成格式

每个程序在编写的都时候都会定义日志格式,大部分都会遵循“syslog”标准。不同事物的日志格式不尽相同,详情请见相关事物的文档,不过一般情况下,日志内容都应该包含,时间,某物,在哪,做了什么。

The Syslog Protocol 规定了每条 syslog 信息应该包含如下内容:

HEADER Structured-Data [MSG] # 头部信息,结构化数据,消息主体

  • HEADER=PRI VERSION TIMESTAMP HOSTNAME # 优先级、版本、时间出、主机名
    • PRI=Facility*8+Severity # Priority 优先级是一个值,计算方式通过两部分计算,“Facility 设施”与“Severity 严重性”。具体见本章下文具体描述
  • Structured-Data= #

Facility(设施)

Facility 用来表示产生该信息的硬件设备、协议、系统软件、操作系统等可以产生日志消息的事物类别。由于世界上事物太多,所以最好以类别的方式来对各个事务进行分类,所以使用 Facility(设施) 来描述。比如security/authorization这个设施中就包含很多关于安全认证的应用程序产生的日志类别。

每个 Facility 都对应一个值以便进行 PRI 的计算,以下是 RFC5424 中规定的几十类 Facility。其中括号中的数字表示 Facility 对应的 Numerical Code(数字码)。

  • kernel messages(0) # 内核信息类
  • user-level messages(1) # 用户层信息类,比如用户使用 logger 命令来记录日志功能
  • mail system(2) # 邮件系统类型
  • system daemons(3) # 系统守护进程类,比如 systemd 管理的服务的信息。
  • security/authorization messages(4) # 安全与认证信息类,比如 login、ssh、su 等需要账号密码的。
  • messages generated internally by syslogd(5) # 由 syslog 相关协议产生的信息类,就是 rsyslog 程序本身的日志信息。
  • line printer subsystem(6) # 打印子系统类
  • network news subsystem(7) #
  • UUCP subsystem(8) #
  • clock daemon(9) #
  • security/authorization messages(10) #
  • FTP daemon(11) # FTP
  • NTP subsystem(12) # NTP 子系统
  • log audit(13) # 日志审计
  • log alert(14) # 日志报警
  • clock daemon(note 2)(15) #
  • local use 0~7 (local0~7)(16~23) # 留给用户自定义的类别,比如可以把某些程序归为 Local0~7 中的某一类,然后来收集该类的日志

Severity

Severity 用来表示该日志信息的严重程度,也叫日志的级别 Level。为了便于日志管理,需要对日志的内容进行划分,哪些信息是正常的,哪些信息是错误的,哪些信息是警告等等。一般情况分为以下几类,其中第一列数字表示对应的 Severity 的值,第二列为 Severity 的名称以及其所描述的严重程度的具体概念。以下严重程度由高到底进行排列,debug 属于特殊的 Severity

  • 0 Emergency: 系统不可用 system is unusable
  • 1 Alert: 必须立即采取行动 action must be taken immediately
  • 2 Critical: 临界状态 critical conditions
  • 3 Error: 错误状态 error conditions
  • 4 Warning: 警告状态 warning conditions
  • 5 Notice: 正常但是值得注意的状态 normal but significant condition
  • 6 Informational: 信息 informational messages
  • 7 Debug: debug 级别的信息 debug-level messages

常见日志级别

  • Emergency ( 紧急 ): 关于 SYN 攻击、Tear Drop 攻击及 Ping of Death 攻击的消息。
  • Alert ( 警示 ): 关于需要立即引起注意的情况 ( 例如防火墙攻击和许可密钥到期 ) 的消息。
  • Critical (关键 ): 关于可能影响设备功能的情况 [例如高可用性 (HA) 状态更改 ]的消息。
  • Error (错误): 关于可能影响设备功能的错误情况 (例如反病毒扫描失败或与 SSH 服务器通信失败) 的消息。
  • Warning( 警告 ):关于可能影响设备功能的情况(例如连接到电子邮件服务器失败或认证失败、超时和成功)的消息。
  • Notification (通知 ): 关于常规事件 ( 包括由 admin 发起的配置更改 ) 的消息。
  • Information ( 信息 ): 可提供关于系统操作一般信息的消息。
  • Debugging ( 调试 ): 可提供调试时所用详细信息的消息。

最后修改 August 13, 2024: database (f86258b4)