相信互联网的从业人员,或多或少都会接触access_log进行一些信息的提取和分析,那么如何高效的达成目标,今天我就将业务线的实践分享给大家。
虽然我很羡慕那些能够把access_log分析命令写得足够长的人,但我并不建议在线上依然保持如此原始的方式,通过使用格式化的日志格式,我们会获取以下收益:
- 日志需求分析标准化
- 日志需求分析工具化|插件化
- 日志字段含义清晰
- 离线分析系统统计方法标准化
基于日志格式的规范,不论是单机分析,还是离线集群分析,效率都得到了大幅的提升,我们只需要做数据接入,通过各个产品线提供的插件即可满足绝大部分需求
log_format access
‘[Remote_ip:$remote_addr] ‘
‘[Remote_user:$remote_user] ‘
‘[Querytime:$time_local] ‘
‘[Request_url:$request] ‘
‘[Request_status:$status] ‘
‘[Request_byte_B:$bytes_sent] ‘
‘[Request_time_s:$request_time] ‘
‘[Http_referer:$http_referer] ‘
‘[Http_agent:$http_user_agent] ‘;
注意事项
- 要明确定义单位,从而让分析系统能够自适应
- 含义要清晰和标准,便于各类角色都能够统一理解
- 分隔符要避免使用url中可能出现的字符
日志示例
调整前:
10.10.10.10 – – [18/Mar/2016:09:47:16 +0800] “GET /test.php HTTP/1.1” 844 200
调整后:
[Remote_ip:10.10.10.10] [Remote_user:-] [Querytime:18/Mar/2016:09:47:16 +0800][Request_url:GET /test.php HTTP/1.1] [Request_status:200] [Request_byte_B:844]
问题:在日志中找出访问次数最多的几个分钟
- 原始格式:awk ‘{print $4}’ access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
- 优化格式:cut -d “]” -f3 access_log|cut -d “:” -f2-4|sort |uniq -c |sort -nr|head
结论:优化格式,可以用最简单的命令,100%保证日志分析结果的可靠性和通用性,且越复杂的场景,其带来的收益越显著。