半世纪前说起日志,想到的是船长、操作员手里厚厚的笔记。如今计算机诞生使得日志产生与消费无处不在:服务器、路由器、传感器、GPS、订单、及各种IoT设备通过不同角度描述着我们生活的世界。借助于计算力量,通过采集、处理、使用日志,我们不断更新对整个世界以及体系的认知。

日志是什么?

从船长日志中我们可以发现,日志除了带一个记录的时间戳外,可以包含几乎任意的内容,例如:一段记录文字、一张图片、天气状况、船行方向等。几个世纪过去了,“船长日志”的方式已经扩展到一笔订单、一项付款记录、一次用户访问、一次数据库操作等多样的领域。

日志这种广泛使用模式之所以经久不衰,在于“日志是一种简单的不能再简单的存储抽象”。它是一个只能增加的,完全按照时间排序的一系列记录。日志(时间序列数据)看起来如下:

图 1. 日志序列


我们可以给日志末尾添加记录,并且可以从左到右读取日志记录。每一条记录都指定了一个唯一的有一定顺序的日志记录编号。

日志顺序由“时间”来确定,从图上可以看到日志从右到左的时间顺序,新产生的事件被记录,过去的事件渐渐远去,但它记录了什么时间发生了什么事情,这无论对于计算机、人类、还是整个世界而言,是认知与推理的基础。

日志服务中的日志(Log)

日志(Log)是系统在运行过程中变化的一种抽象,其内容为指定对象的某些操作和其操作结果按时间的有序集合。文件日志(LogFile)、事件(Event)、数据库日志(BinLog)、度量(Metric)数据都是日志的不同载体。在文件日志中,每个日志文件由一条或多条日志组成,每条日志描述了一次单独的系统事件,是日志服务中处理的最小数据单元。

日志服务采用半结构数据模式定义一条日志。该模式中包含主题(Topic)、时间(Time)、内容(Content)和来源(Source)四个数据域。

与此同时,日志服务对日志各字段的格式有不同要求,具体如下表所示:

数据域 含义 格式
主题(Topic) 用户自定义字段,用以标记一批日志。例如访问日志可根据不同站点进行标记。 包括空字符串在内的任意字符串,长度不超过128字节。默认情况下,该字段为空字符串。
时间(Time) 日志中的保留字段,用以表示日志产生的时间,一般由日志中的时间信息直接提取生成。 整型,Unix标准时间格式。单位为秒,表示从1970-1-1 00:00:00 UTC计算起的秒数。
内容(Content) 用以记录日志的具体内容。内容部分由一个或多个内容项组成,每一个内容项为一个Key-Value对。 Key为UTF-8编码字符串,包含字母、下划线和数字,且不以数字开头。长度不超过128字节。不可以使用如下关键字:
  • __time__
  • __source__
  • __topic__
  • __partition_time__
  • _extract_others_
  • __extract_others__
Value为任意字符串,长度不超过1024*1024字节。
来源(Source) 日志的来源地,例如产生该日志机器的IP地址。 任意字符串,长度不超过128字节。默认情况下该字段为空。
标签(Tags) 日志的标签,包括:
  • 用户自定义标签:您通过API PostLogStoreLogs写入数据时添加的标签。
  • 系统标签:服务端为您添加的标签,包括__client_ip____receive_time__
字典格式,Key和Value均为字符串类型。在控制台查询日志时,以__tag__:为前缀展示。

实际使用场景中,日志的格式多样。为了帮助理解,以下以一条nginx原始访问日志如何映射到日志服务日志数据模型为例说明。假设用户nginx服务器的IP地址为10.249.201.117,以下为该服务器的一条原始日志:

10.1.168.193 - - [01/Mar/2012:16:12:07 +0800] "GET /Send?AccessKeyId=8225105404 HTTP/1.1" 200 5 "-" "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2"

把该条原始日志映射到日志服务日志数据模型,如下:

数据域 内容 说明
Topic “” 沿用默认值,即空字符串。
Time 1330589527 日志产生的精确时间,表示从1970-1-1 00:00:00 UTC计算起的秒数。从原始日志中的时间戳转换而来。
Content Key-Value对 日志具体内容。
Source “10.249.201.117” 使用服务器IP地址作为日志源。
Tags 由用户添加或者服务端添加。

用户可以自己决定如何提取日志原始内容并组合成Key-Value对,例如下表:

Key Value
ip “10.1.168.193”
method “GET”
status “200”
length “5”
ref_url “-“
browser “Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2”

日志组

一组日志的集合,写入与读取的基本单位。

日志组的限制为:最大 4096 条日志,或 10MB 空间。

图 2. 日志组