分析网站日志可以帮助我们了解用户地理信息,统计用户行为,发现网站缺陷。该操作将面临几个问题。日志分析工具splunk如何使用?日志格式信息不全,如何配置日志打印出全面的信息?有很多爬虫访问,不是真正的流量,如何去掉这些流量?如果网站使用了CDN加速、反向代理、网关等,日志打印了这些设备的ip,如何获取用户的真实ip?阅读本文可以帮助您有效解决上述问题。Splunk安装使用日志分析工具Splunk是一款商业软件,但也有免费版。免费版限制每天处理500M以内的日志。简单分析的话,500M也能挖掘出很多信息。本文使用免费版splunk分析Apache离线日志。首先,到splunk官网注册用户。注册用户填写的信息除邮箱地址外无需真实,公司可以盲填。注册完成后,进入下载页面选择Linux64位版本,选择命令行下载,会给出一个wget命令,复制wgt命令,在Linux上执行,得到压缩包.(wget命令splunk-8.0.5-xxx的xxx每个人都不一样)[root@localhostsplunk]#wget-Osplunk-8.0.5-xxx-Linux-x86_64.tgz'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.5&product=splunk&filename=splunk-8.0.5-xxx-Linux-x86_64.tgz&wget=true'解压压缩包,在bin目录下执行./splunk开始查看协议条款按q,你同意协议吗?输入yDoyouagreewiththislicense?[y/n]:y输入admin作为用户名,输入adminroot作为密码。如果出现TheSplunkwebinterfaceisathttp://192.168.56.106:8000,则表示启动成功。与开源工具(ELK、graylog)相比,确实省心不少。确保Linux防火墙是关闭的,然后在浏览器中输入前面的8000地址打开登录即可。第一次会有一个如何上传文件的引导教程。日常生活中如果要上传文件,只需点击左上角的splunk->enterprise进入主界面,然后选择添加数据即可。添加数据的方法有很多种。如果你选择上传到这里,日志文件已经在我的电脑里了,你可以像附件一样上传。扑通一声。这个过程都是默认的,上传文件需要一段时间。在设置Apache日志的“来源类型”时,在web.xml中选择access_combined。接下来,“检查”,“提交”是默认的。如果文件上传成功,点击“开始搜索”按钮,搜索刚才上传的日志数据。搜索框用于搜索限制。右下是原始日志,左边是各个字段的名字。这些字段内置于工具中。符合格式的日志会自动解析出这些字段。比如每条日志都是以一个开头的,客户端的ip就是左边的clientip。鼠标点击clientip可以看到统计结果。默认是出现频率最高的前10个ip。如果要统计更多,需要在搜索框中使用相应的语法查询。Splunk搜索语言介绍(SPL文法)文法用于搜索框达到限定范围,统计需要的指标。语法就像是“搜索引擎+SQL+shell”的混合体。如果使用得当,它是非常强大的。基本语法,source="access2020-09-11.log"host="basicserver"sourcetype="access_combined"source表示数据源文件名,host为Splunk所在主机名,sourcetype在导入时配置.这些是可以改变的。我想统计10号的数据,以access2020-09-10.log为源实现效果。如果想不分日期查看basicserver中的所有数据,去掉source条件,只保留host和sourcetype这两个条件。搜索框必须至少有一个条件。最常访问的200个iphost="basicserver"|topclientiplimit=200客户端地理信息iphost="basicserver"|iplocationclientipclientip执行后,左下方会比刚才多出“感兴趣的字段”CityCountryRegion字段,这些对应客户端ip的地理位置。访问频率最高的前10个城市host="basicserver"|iplocation客户端|topCitylimit=10在地图上查看ip分布host="basicserver"|iplocation客户端|geostats统计有多少不同的ip访问网站host="basicserver"|statsdc(clientip)所有日志记录按时间正序排列host="basicserver"|sort_time默认倒序,最新的日志排在访问次数最少的最前面ihost="basicserver"|访问次数最多的稀有客户端urihost="basicserver"|topurilimit=20clientip不等于两个网段的记录host=basicserverclientip!="158.111.2.*"clientip!="192.190.2.*"要添加,可以在搜索框输入很多条件,搜索框会随着条件的增加而变大,不用担心条件太多装不下。在数据可视化搜索栏下方,依次是事件、模式、统计和可视化选项。最后一个可视化选项可以生成图表。最好在搜索命令中计算出某个统计指标,然后点击Visualization。如果不计算指标直接点击可视化,配置生成图表会比较麻烦。假设搜索栏统计某天访问次数最多的20个clientips,命令为source="access2020-09-11.log"|topclientiplimit=20执行后会在统计信息下列出前20个IP,点击Visualization,选择Histogram。直方图出来后,点击格式,配置坐标ip竖直显示,这样看起来更舒服。如何更新ip地址的地理信息数据库统计ip的地理位置取决于地理信息数据库。安装时有内置库,不是最新的。如果要更新到最新的,需要到https://dev.maxmind.com/zh-ha...下载最新的GeoLite2-City.mmdb(先注册),复制这个文件到splunk/share目录覆盖原来的同名文件。删除数据删除所有数据。/splunkcleaneventdata-f删除属于索引indexname的数据。/splunkcleaneventdata-indexindexname-fApache日志需要注意common和combined格式日志格式有两种格式,commonandcombined,而且combinedformat的信息更全面,比commonformat有更多的refer和useragent信息。下面是apache/conf下httpd.conf文件中两种格式的定义LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combinedLogFormat"%h%l%u%t\"%r\"%>s%b"common如果commonlog不能满足分析需求,可以将格式改为通用格式。方法是修改apache/conf下的httpd.conf文件,将里面的CustomLog结尾配置为combinedCustomLog"|/opt/apache/bin/rotatelogs/opt/apache/logs/access%Y-%m-%d.log86400》结合不能直接看到用户真实IP。如果网站前面有反向代理或者网关,或者网站有CDN加速,那么日志中的clientip就是代理服务器、网关或者CDN加速服务器的IP,分析价值不大。获取用户真实ip,可以修改httpd.conf的LogFormat,添加%{X-FORWARDED-FOR}i(简称XFF),我直接在%h后面添加了XFF,LogFormat"%h%{X-FORWARDED-FOR}i%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combinedLogFormat"%h%{X-FORWARDED-FOR}i%l%u%t\"%r\"%>s%b"common假设网站有CDN加速(其他情况同理分析),按照上面的格式,每条日志先打印CDN加速服务器ip,再打印XFF的ip(也就是用户的真实ip)。如果用户不是直接通过CDN访问,那么XFF就是一个横线“-”。Apache动态加载配置文件修改配置文件后,无需重启Apache,在Apache/bin下执行./apachectlgraceful即可在不停止服务的情况下动态加载配置文件,新配置立即生效。splunk如何解析XFF字段Splunk内置的access_combined和access_common格式无法解析XFF。如果想正确解析,需要修改splunk/etc/system/default/transforms.conf,新增[xff]段配置XFF正则[xff]REGEX=\d{1,3}(\.\d{1,3}){2,3}修改[access-extractions]部分,添加([[nspaces:xff]]s++)?在clientip匹配XFF[access-extractions]REGEX=^[[nspaces:clientip]]\s++([[nspaces:xff]]\s++)?[[nspaces:ident]]\s++[[nspaces:user]]\s++[[sbstring:req_time]]\s++[[access-request]]\s++[[nspaces:status]]\s++[[nspaces:bytes]](?:\s++"(?
