wuyongxiu / wuyongxiu.github.io

随便记录一下......
http://wuyongxiu.github.io
6 stars 3 forks source link

Access Log ( Common Log Format ) #21

Closed wuyongxiu closed 7 years ago

wuyongxiu commented 7 years ago

一 前言

之前在实现网关的access log的时候,对于该打印哪些,按照什么格式打印都毫无头绪。在读了Ngnix和其它项目的访问日志后,才有了具体可参照的标准。
Nginx日志详解:http://blog.chinaunix.net/uid-22312037-id-4089710.html
Common_Log_Format: https://en.wikipedia.org/wiki/Common_Log_Format

遵循标准的一个重要作用是,可以复用他人的劳动成果。随意在github上进行关键字检索,就可以搜到很多开源实现了的 log parser。
image
这一个优点在wiki上也有提到
image
因此在网关访问日志的实现上我准备完全参照Nginx的访问日志实现方式。

二 日志定义

提前定义一组标准字段
'$apigw_name $remote_addr [$time_local] "$request" $status $upstream_status'
'$body_bytes_sent $body_bytes_received "$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $upstream_addr $request_time $upstream_time'

$apigw_name:网关名称,暂时用 ip:port表示
$remote_addr:远程客户端的ip地址
$time_local: 访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request: 请求的URI和HTTP协议
$status: 记录请求返回的状态码,例如成功是200
$upstream_status: upstream状态,比如成功是200
$body_bytes_sent:发送客户端的body主体大小
$body_bytes_received: upstream返回给网关的body主体大小
$http_referer: 记录从哪个页面链接访问过来的
$http_user_agent: 客户端浏览器信息
$http_x_forwarded_for: 客户端的真是ip
$upstream_addr: upstream的地址,也就是网关后端节点地址
$request_time: 请求总时间
$upstream_time: 后端节点处理请求时间

红色为默认指定的格式样式,日志示例如下
192.168.1.102 [18/Mar/2013:23:30:42 +0800] "GET /stats/awstats.pl?config=scq2099yt HTTP/1.1" 404 899 "Mozilla/4.0 (compatible; MSIE 6.0; Windows XXX; Maxthon)" "192.168.1.102" -

其中 - 表示未赋值。
除了默认的字段不需要选择外,其它字段都需要选择后才会打印。并且日志的打印顺序和提前定义的顺序一致。

三 日志管理

1 日志格式管理
日志格式的管理通过在配置文件定义或者在开放平台中定义来实现。日志格式可以是在API层面上(即一个API对应一个日志格式),也可是是在服务层面上(一个服务对应一个日志格式)实现,当然也可以是网关层面即一个网关对应一个日志格式。通过配置文件定义的话则一定是在网关层面上。
这里我决定先采用网关层面的日志格式管理,并且日志格式通过配置文件来定义。

2 日志管理
① 日志具有开关标志,开关既可以在配置文件中指定,也可以通过API更改(管理日志的API)
② 可以在网关的API(网关定义的后端服务的API)层面上选择打印日志与否。将网关要打印的API(后端服务API)添加进要打印的日志列表中,若HTTP请求请求的API在日志列表中,则打印此请求。API列表的管理也是通过网关提供的一组API(日志管理API)来进行管理。
这里我采用通过实现一组日志管理的API来管理日志,所以日志管理可以动态进行。

四 日志实现