TrafficServer日志系统配置指南
淘仇恕(张云开)
原文放在Google Doc里,这里只做镜像不更新
一、TS日志系统简介
在中大规模的软件系统中,日志系统(logging system),已经成为标配。Linux有syslog,Java有Log4j,Python有logging模块。日志系统的模型,已经非常成熟,大体如下图所示:
概括地说,就是日志系统里,允许配置多个日志对象(LogObject),这些对象描述了日志的过滤规则(filter)、格式(format)、以及日志的去向(target)。日志的输入(input),是通过约定的日志API,由应用程序调用这些API完成输入。日志最终会输出(output)到磁盘或写入到网络的另一台日志服务器上。
在TrafficServer中:
日志输入,由的TrafficServer的worker线程完成,这些线程会把HTTP状态机的信息,直接传递给日志系统的API里。
日志API,由两个简洁的函数组成:Log::access()——访问日志,Log::error()——错误日志。
日志对象,通过一个logs_xml.config文件描述,这个文件通常位于:/etc/trafficserver/目录下,文件内部对配置方法有详细的描述。
日志输出,由LogObject的target属性描述,但在具体的logs_xml.config中,target属性由LogObject的Filename及CollationHosts描述。如果不存在CollationHosts,则表示输出到本地磁盘,否则输出到网络上的日志服务器。
在讲解TS的日志系统配置之前,需要先了解TS日志系统的内部结构,包括它的线程模型、工作流程。下图对其内部结构进行简要描述:
由上图可知,TS的日志系统,其线程包含:
worker线程,即日志的输入方,它会调用Log::access()/Log::error() 日志API。在这些API内部,会根据用户在logs_xml.config配置的LogObject对日志进行过滤。若满足了过虑条件,则把该条日志写入到该LogObject下的LogBuffer里。若LogBuffer已满,则把它发送到预处理线程的queue里,然后继续与下一个LogObject的过虑条件进行匹配,直到所有LogObject都匹配结束。
preproc线程,即预处理线程,它负责做一些转换工作(例如,把worker线程传递进来的HTTP状态机,根据LogObject的format格式,转换成Ascii字符串,这部分转换工作不是必需的,取决于LogObject配置的日志类型,若是二进制类型则不进行转换),然后根据LogObject的target类型,把预处理后的数据发送到flush队列或collation队列。