输出到日志文件中的日志,每一行都应该是有用的 一般日志都能为我们所用,直到服务器忙不忙,健康状态,根据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扔进去