欢迎访问我的博客,你的支持,是我最大的动力!

[使用ELKStack打造日志分析平台01]使用json格式实现日志标准化

ELK Stack 小马奔腾 10629℃ 评论
目录:
[显示]

这是本系列文章的第一篇。目标是梳理使用ELKStack工具栈实现web和系统日志的实时分析展现平台。ELK即Elasticsearch、Logstash、Kibana三款软件首字母的组合,那为什么是Stack呢,其实这套工具链并不只是包含前在说的这三款软件,还有很多的其它软件可以集成到这个体系中,本系列文章中,我们还将遇到Filebeat,Redis,还有ES(Elasticsearch)的三款常用的插件:Head、Bigdesk、Kopf。Elasticsearch是一款很优秀的实时的全文搜索、存储和分析引擎,具备海量数据的实时分析处理能力,使用它来处理和分析日志,只用到它功能的冰山一角吧,但是,这对于服务运维人员来讲,够用,好用才是王道。

这一系列的文章主要侧重于最佳实践,我会对重要的点特别说明,但并不想写成对这些软件配置和使用的的参考书,所以,软件具体的各参数的含义,限于篇幅,并不会说明,仅会罗列我认为可行的配置文件的片断,要深入理解为什么这样配置,还可以怎样配置,配置的含义,则建议参考官方文档或者网上的资料。

我把内容定义为自己实践的笔记,虽不够详尽,但照着做,理应正常运转,如遇到bug请留言或者google罢。

确定需要收集的日志

我的站点使用的是apache以及nginx,所以,我收集apache和nginx的访问日志。另,操作系统为linux,那么,我还要收集系统日志中级别大于等于warning的系统日志。

版本信息

需要收集的日志来源于apache和rsyslog,所以先展示一下我测试用的版本,如版本不一致,不保证配置一样,仅可参考

httpd -v
Server version: Apache/2.4.6 (Unix)
Server built: Oct 17 2017 14:39:06/usr/sbin/rsyslogd -v
rsyslogd 7.4.7, compiled with:
FEATURE_REGEXP: Yes
FEATURE_LARGEFILE: No
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
Runtime Instrumentation (slow code): No
uuid support: Yes./nginx -v
nginx version: nginx/1.13.6hostnamectl
Static hostname: localhost.localdomain
Icon name: computer-vm
Chassis: vm
Machine ID: 28f6ddc8583b42d1bb3e7fd89dfc8955
Boot ID: d024156ac81149389092ba065503f8eb
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-514.el7.x86_64
Architecture: x86-64

日志标准化

apache的访问日志格式、nginx的访问日志和rsyslog的系统日志格式显然是不一样的,要对日志进行统一采集和后期处理,显然不能直接拿来就用,最佳的方案是把日志按照各部分的内容分成不同的字段,这样,后期的分析和使用才会更高效,可以从日志中获取的有价值的信息也就越多。

要得到标准化的日志,有两种可行的方案,一个是对日志进行正则分割和匹配,这是Logstash的强项,但是使用正则通常要写正则表达式,要保证表达式的结果和遇想的一致,需要对正则非常熟悉,此外,正则匹配是依赖CPU的算力实现的,处理大量日志时,会造成一定的CPU压力;另一种方案是使用json格式,因为json是以键值对的形式构建的,所以,每一部分可以很好的被提取出来,不需要太多的计算。所以最佳的方式是使用json格式的日志。

apache日志json化

apache默认日志是这样的:

LogFormat "%h %{X-Forwarded-For}i %t %>s \"%r\" \"%{Referer}i\" \"%{User-Agent}i\" %b %l %u" combined
192.168.1.10 100.13.222.34 [12/Mar/2018:10:51:52 +0800] 200 "POST /my/pash HTTP/1.1" "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36" 61 - -

有些字段不需要,有些字段又没有,所以,需要大的改造。
下面贴上我自己的格式:

各字段说明:

示例:

{
"timestamp":"2018/03/12 13:09:21",
"remoteip":"192.168.10.20",
"realip":"-",
"status":"200",
"way":"GET",
"url":"/index.php",
"filename":"/var/www/html/index.php",
"query":"?explorer/treeList&app=explorer&type=init",
"refer":"http://192.168.10.20:88/index.php?explorer&type=iframe&path=",
"agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0",
"time1":0,
"time2":71739,
"output":1286,
"input":850
}
nginx日志json化

nginx默认日志格式是这样的:

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

下面贴上我自己调整好的json格式:

各字段说明:

NginX如果希望将POST数据也记录到日志中,可以这样配置:

注意其中的escape=json和"postdata":"$request_body"

{"timestamp":"2018-05-25T11:40:18+08:00","remoteip":"192.168.1.100","realip":"","status":"200","way":"POST","url":"/list","query":"","refer":"","agent":"aaa (Android 7.0; samsung - SM-G9300)","times":0.046,"input":441,"output":864,"postdata":"{\"personId\":\"2233\",\"page\":\"1\",\"pageSize\":\"20\",\"uid\":\"1017\",\"timestamp\":\"1527219618\"}"}
rsyslog系统日志json化

几点说明:

1、第2行:$ActionFileDefaultTemplate是设置默认日志模板,默认是RSYSLOG_TraditionalFileFormat,这里修改为RSYSLOG_FileFormat,原因是默认的时间显示格式是:Mar 28 17:36:57,修改后:2018-03-28T17:38:27.183733+08:00,后一种是ES可以直接识别的时间戳格式,不需要再做额外的匹配

2、第5-21行:添加自定义模板:rsyslog_json,这个模板是json格式,并且是rsyslog的通用模板,可以处理rsyslog接受的所有日志

3、第24行:仅获取级别高于warning(含)的日志,使用rsyslog_json模板,保存于sys_warning_json.log文件中,注意对模板引用的写法

测试
logger -p warning "Test warning"
logger -p info "Test info"
tail /var/log/sys_warning_json.log

 

 

 

 

 

 

转载请注明:轻风博客 » [使用ELKStack打造日志分析平台01]使用json格式实现日志标准化

喜欢 (0)or分享 (0)