输出到日志文件中的日志,每一行都应该是有用的
一般日志都能为我们所用,直到服务器忙不忙,健康状态,根据ip地址,分析用户分布,尤其是双11,商家最喜欢把用户画像卖给你
同样的数据,不同的人来做,效果不同,数据分析就要和你的建模相关,其实就是大数据相关,一切为了销售来做
日志数据分布在不同发机器上就需要采集,关心的程序日志就要集中管理,
大数据用的比较多的flume,elk的logstash
日志有时候往往落地才进行分析,有一定的延时
如何采集到数据,就立即进行分析,知道有没有人来DD,可以立即分IP
有些数据要慢慢分析,比如用户画像
都需要用分布式系统,先存下来,第二天分析前一天的数据,这个叫离线计算,数据不需要实时去计算
数据采集起来做离线分析
有些时候计算是可以并行的,大数据就是把数据切断,然后一批批处理
得到的结果往往要存储起来,做持久化
有可能也是得到一个中间结果来为下次计算做准备,这样有时候要求速度快的话就需要用到nosql的技术,比如redis,基于内存的字典数据库
前面粗略的过滤和面分析之后的数据给人看的,,就有可能需要可视化
搜索引擎ElasticSearch,收集的日志对它来说都算文本,搜索引擎建立索引库,用来反查你想要的数据,就是个弹性查询,把你的关键字作为key,在文本中的位置作为value,这个key在文件中哪个出现过,就不需要遍历,
用的倒排索引,查得快都是字典
ElasticSearch把手机来的日志形成倒排索引,查有没有出现过,kibana可以做一些分析(网页都做好了)
一般公司这里把ES加进来,查文本一般特别耗时,因为需要遍历,一般的网站背后都用了类似的搜索引擎
数据产生到数据采集有不一样的过程,到最后落地的过程,是有不一样的方式的,hadoop是一种解决方案,hadoop里面有一个分布式存储系统,里面可以做mapreduce,可以替换掉,叫spark,分析完有个结果,结果落地就进入到数据库里去,几十亿条的记录mysql根本扛不住
上亿条的记录放到oracle就很轻松
结构化和半结构化,非结构化数据
非结构化是一眼看不能理解的数据,比如右键打开MP3文件,图片,视频
结构化数据,excel,二维表,schema,行和列组织起来
半结构化数据,下面这种就称为半结构化数据,有组织和格式的,可以分割成行和列进行分析
html超文本标记语言也是半结构化数据,标签代表下满内容呈现出什么样的格式的,把数据如何排版
xml数据和html数据很像
xml数据和html数据很像,往往用来做数据类型,比如下面的7是什么类型,html没说明,xml就可以说明这是一个数值型,所以xml往往会做一个交换格式
这种是有一定结构,可以从中提取数据,称为半结构的数据
非结构化数据往往是流式数据,所以不太好提取
日志是要归类到半结构化数据里去,可以通过一定的格式断开,可以提取数据,把这些有用的数据存到数据库里去,可以按行列分割,当做一个表理解
分析日志相当于在做文本分析,要依赖于文件的IO操作,字符串操作,正则表达式
这是最长见到的日志
这是用户访问的信息,是user agent,非常重要
一定要加这个,不然utc时间差8小时
4个部分,地址,时间,访问方法,useragent
第一个写个字典,加上你要断开的数据,空格,[】,放在一个set里面
每一次进来start都是从0开始,这种就可以提取一部分数据
符号确实替换掉了,但不是我们想要的
如果连续的不合格非法字符,就往后走一个,start继续向后
先解决这个,其他的先不管
从[这个位置开始。一直到后面的,其中start的不需要变化,],[xxxxxx],碰到最后的】相当于开关关了,需要flag,典型开关控制
遇到[代表开始。start=i+1,因为[本身并不算提取的字符串,flag就需要变成true,代表碰到开关了,,只要没碰到]关掉的符号,就一直继续continue下去,向后走,就yield不出来
到elif ==‘】’为止
flag=false
这样就可以了
如果是中括号来边界的,内部一定不会出现中括号,如果引号作为边界。内部也一定不会出现引号
用elif比if少执行一次
如果是中括号就没有可能是引号""
elif==’ " '那么如何判断是左引号还是右引号
flag= not flag 开关开关,这样即可
可以要求记录 日志的时候按\t来划分,不然里面也有空格可能分不清楚,\t作为列间隔符,这样就可以直接用字符串切割
能否用ascii01来表示间隔符,用01和09都是可以的,间隔的时候直接用01来切割,但是如果改变不了,就只能自己改变
现在就成功了
这种代码可以不写也可以直接用正则表达式来提取下面可以用到类型转换,
时间转换,给你时间字符串进行转换
z是市区
这样单纯转换的简单函数可以用lambda
状态码和大小用int转一下,其他什么都不做
现在想要把request里面的再细化,分成method ,url,,protocol,用zip配上名字
把这些放在后面
现在拿到这些数据根本没有名字,现在要按名字,顺便把类型转换了
所以下面写一个函数 extract
makekey(line)是一个生成器,可迭代对象,可以用zip,把三个结合起来,三元组,一一对齐,拿到name的每一项作为key
triple三元组,但是构建字典要二元组,如果现在不是none,不是none就调用后面makekey【line】处理(得到一项项值)
如果是none就是triple{2】自己,否则就进行类型的转换
这就是三元组变二元组这个过程
也可以写一个函数,donoting,none就是什么传什么进去,就下面不要判断了
写成这样还不行,因为map什么都不是
extract是返回dict,直接把line扔进去