本文已参与「新人创作礼」活动,一起开启掘金创作之路。
承接上一篇GoAccess安装之后,本文章内容主要为了自定义log_format的解析使用说明
文章主要分为两部分:
- 一、官方自定义格式说明
- 二、本次自定义格式解析nginx日志实验
网上大部分说的都是使用GoAccess解析固定的nginx-log_format格式 例如:
nginx log_format配置:
log_format main '$remote_addr - $remote_user [$time_local] requesthost:"$http_host"; "$request" requesttime:"$request_time"; '
'$status $body_bytes_sent "$http_referer" - $request_body'
'"$http_user_agent" "$http_x_forwarded_for"';
GoAccess log_format配置:
log-format %h - %^ [%d:%t %^] requesthost:"%v"; "%r" requesttime:"%T"; %s %b "%R" - %^"%u"
但是事实上,很多情况下,服务器中nginx早已经存在了,而且日志文件有可能会用于其他方面,所以不方便调整nginx的log_format配置的情况下,可以根据自身之前的log_format配置进行调整GoAccess的log_format的配置。
官方使用手册:
GoAccess 可以解析虚拟的任意 Web 日志格式,以及允许任意的自定义格式字符串。
- time-format参数:time-format 后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。 eg:他们都由百分号 (%)开始。 %T 或者 %H:%M:%S.
- date-forma参数:date-format 后跟随一个空格符,指定日志的日期格式,包含普通字符与特殊格式说明符的任意组合。 eg:他们都由百分号 (%)开始。
注意: 如果给定的时间戳以微秒计算,则必须在 time-format 中使用参数 %f 。
- log-forma参数:log-format 后跟随一个空格符或者制表分隔符(\t),用于指定日志字符串格式。
具体特殊格式说明符
- %x 匹配 time-format 和 date-format 变量的日期和时间字段。用于使用时间戳来代替日期和时间两个独立变量的场景。
- %t 匹配 time-format 变量的时间字段。
- %d 匹配 date-format 变量的日期字段。
- %v 根据 canonical 名称设定的服务器名称(服务区或者虚拟主机)。
- %e 请求文档时由 HTTP 验证决定的用户 ID。
- %h 主机(客户端IP地址,IPv4 或者 IPv6)。
- %r 客户端请求的行数。这些请求使用分隔符(单引号,双引号)引用的部分可以被解析。否则,需要使用由特殊格式说明符(例如:%m, %U,%q 和 %H)组合格式去解析独立的字段。
注意
: 既可以使用 %r 获取完整的请求,也可以使用 %m, %U, %q and %H 去组合你的请求,但是不能同时使用。
- %m 请求的方法。
- %U 请求的 URL。
注意
: 如果查询字符串在 %U中,则无需使用 %q。但是,如果 URL 路径中没有包含任何查询字符串,则你可以使用 %q查询字符串将附加在请求后面。
- %q 查询字符串。
- %H 请求协议。
- %s 服务器回传客户端的状态码。
- %b 回传客户端的对象的大小。
- %R HTTP 请求的 "Referer" 值。
- %u HTTP 请求的 "UserAgent" 值。
- %D 处理请求的时间消耗,使用微秒计算。
- %T 处理请求的时间消耗,使用带秒和毫秒计算。
- %L 处理请求的时间消耗,使用十进制数表示的毫秒计算。
- %^ 忽略此字段。
- %~ 继续解析日志字符串直到找到一个非空字符(!isspace)。
- ~h 在 X-Forwarded-For (XFF) 字段中的主机(客户端 IP 地址,IPv4 或者 IPv6)。
自定义log_format解析实验
因有解析nginx日志的需求,但是nginx的log_format是已经配置过的,所以在不调整nginx_logformat的情况下,使用GoAccess进行解析
常规的log_format参数配置
nginx log_format配置:
log_format main '$remote_addr - $remote_user [$time_local] requesthost:"$http_host"; "$request" requesttime:"$request_time"; '
'$status $body_bytes_sent "$http_referer" - $request_body'
'"$http_user_agent" "$http_x_forwarded_for"';
GoAccess log_format配置:
log-format %h - %^ [%d:%t %^] requesthost:"%v"; "%r" requesttime:"%T"; %s %b "%R" - %^"%u"
我的nginx-log_format配置如下
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $upstream_addr $request_time';
因nginx和goaccess的log_format配置必须要一一对应的关系,再根据上边特殊格式的含义
去掉requesthost、"%v"、requesttime,后边加上 - %^ %T
注:一定要仔细,一个log_format配置的字符中有一个空格,那另外一个log_format配置中也必须有一个空格
得出自定义的goaccess的log_format
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T
正常情况下,time-format和date-format是不用调整配置的 所以我本次的goaccess的配置如下
time-format %T
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T
然后使用该配置文件进行解析日志 (如果日志文件较大,会出现Parsing解析中字样)
[root@k8s-etcd-2 ~]# /usr/local/bin/goaccess -a -c -d -f /var/log/nginx/access.log -p /usr/local/etc/goaccess/goaccess.conf > /home/test.html
Parsing... [215,438] [35,906/s]
等待解析完成之后,查看网页即可