开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第一阶段):网站流量日志埋点收集—日志格式、日志切分】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/693/detail/12178
网站流量日志埋点收集—日志格式、日志切分
内容简介
一、日志格式
二、日志切分
三、小结
本节内容我们学习埋点收集数据的细节问题:日志格式和日志切分。这两个知识点的学习主要是帮助我们把系统变得更加完善,更加贴近于实战。
一、日志格式
所谓的日志格式,重点考虑的就是日志当中存在的多个字段,字段之间的分割符该怎么确定?我们当下所采集收集的数据是不是就要我们后面进行处理,分析,那么如果说分隔符确定不好的话,就会给后面的分析处理带来很大的麻烦,或者做一些无用的功。所以日志格式很有必要。
接下来我们看到 nginx 中它原生的字段之间是用空格进行分割的,有好也有不好。
分隔符确定不好的情况:
我们设置日志格式以@符作为分隔
1@allen@18@Beijing@allen@itcast.cn,这样的分隔符就明显设计的不好,因为当我们后面需要去处理这个数据时,首先要针对数据做切割 split(“&”),这个切割符的弊端就在于邮箱这里的@符,@符到底是分隔符的@,还是邮箱的@,所以这样的分隔符确定不好。
所以说好的日志格式好的分隔符非常方便与我们后续的处理。
我们的处理重点都是在我们的数据仓库 hive 当中分析,hive 当中默认的分隔符是\001。
通常常见的分隔符:
固定数量的字符(ABABA),制表符分隔符,空格分隔符,其他一个或多个字符,特定的开始和结束文本。不管什么分隔符,一切以有利于后续程序的解析为标准。
二、日志的切分
日志的切分主要跟 nginx 软件相关,nginx 软件有一个非常大的弊端,就是它生成的文件,日志默认在我们的 access.log中,它会一直往这一个文件写,不会进行滚动。如果系统上限预警则会导致这个文件会变得越来越大,文件变大后,不管是文件后续的移动还是处理都是不方便的。
这时候就需要针对日志做一个相关的切分,比如按照时间进行切分,一天切割一个文件或一小时切割一个文件,也可以按照大小进行切分等。但不管怎么切分,我们的 ngjnx 中并没有开放这样的参数给我们去控制它。
那我们怎样完成文件的滚动?这里运用了巧妙的技术:首先先普及一个 USR1信号,当我们给一个程序发送这样的信号时,这个程序通常会重载我们的配置文件,重载配置文件的同时打开我们新的日志。
我们怎么间接控制 nginx,完成文件的滚动:
通过 crontab 定时调用一个 shell 脚本实现,脚本负责文件日志的切分,而定时器负责控制按照何种频率进行控制。比如脚本完成后,定时器配置为59min,则会在59min进行控制执行。所以定时器的任务是控制频率,重点在我们的脚本中。
脚本代码:
ngigx _path_ prefix=/usr/1ocal/ nginx
time=` date +%Y%m%d%H^ ,
mv ${nginx_ path_ prefix) /logs/user _defined. log
$ (nginx_ path_ prefix} /logs/user_ defined-$ {time}. log
kill -USR1 `cat S{nginx _path _prefix} /logs/nginx. pid
首先定义变量,叫 ngigx _path_ prefix,指向 nginx 安装路径,然后是时间,`是反引号,反引号的目的是表示立即执行命令,获取时间。
这个核心重点是我们做一个 mv 的移动操作,把 nginx_ path_ prefix) /logs/下文件改名字添加日期变成另一个文件,那么为什么要移动?
重点在最后一个脚本 kill -USR1 `cat S{nginx _path _prefix} /logs/nginx. Pid ,首先这里出现了反引号表示立即执行命令去 cat{nginx _path _prefix} /logs/nginx. Pid 文件,
在文件 nginx.pid记录的是 nginx 运行时的进程号,也即我们首先读取到 nginx 的进程号,给进程发送一个 -USR1的信号,当我们 nginx 进程接到信号后它就会以下操作,停止当前请求然后重新载入配置文件,在重载配置文件的同时打开一个新的文件,而之前的文件通过 mv 移动给它重命名,这样就间接完成了日志的切分。
所以这个技术就是给它发送信号,做一个临时的中断,这样就可以控制我们的 nginx 日志重新打开一个新的日志文件,之前的日志文件通过 mv 的命令操作把它改名就可以滚动然后配合定时器完成定时切分。
三、小结
日志格式和日志切分并不是系统必备的,但是拥有后会使我们的埋点采集数据变得更加完整,立体和丰富。
小结:
日志切分
nginx 默认把日志一直写在一个文件中 access.log 不利于后续的维护移动操作处理
通过shell脚本给nginx进程发送usr1信号告知其重载配置文件在重载配置文件的时候重新打开一个新的日志。
文件在配合 crontab 定时器从而完成间接的通过时间控制文件的滚动。