Python 日志模块,python日志采集分析

  Python 日志模块,python日志采集分析

  会有大量的系统日志、应用日志、安全日志等。在生产日志分析中。通过对你的日志的分析,你可以知道服务器的负载和健康状况,分析客户的分布和行为,甚至可以根据这些分析做出预测。

  一般采购流程:

  输出-采集(logstash,Flumen,Scribe)-存储-分析-存储(数据库,NoSQL)-可视化开源实时日志分析ELK平台

  Logstash收集日志并存储在ElasticSearch集群中,而Kibana从es集群中查询数据生成图表并返回给查看器。

  数据提取半结构化数据

  日志是半结构化数据,是经过组织和格式化的数据。可以分为行和列,可以理解为一个表来处理。当然里面的数据也是可以分析的。

  文本分析

  它是一个文本文件,依赖于文件IO、字符串操作、正则表达式等技术。

  通过这些技术,可以提取日志所需要的数据。

  使用正则表达式

  import RES= 123 . 125 . 71 . 36---[06/Apr/2017:18:09:25 0800] GET/HTTP/1.1 200 8642 - Mozilla/5.0(兼容;\ Baiduspider/2.0;http://www . Baidu . com/search/spider . html) pattern= ([\ d .]{ 3,})-\[(。*)\] (\w ) (\S)(。*) (\d \ d ) - (。*) regex=re . compile(pattern)def extract(log:str):m=regex . match(log)if m:print(m . groups())extract(s)

  使用命名分组

  import RES= 123 . 125 . 71 . 36---[06/Apr/2017:18:09:25 0800] GET/HTTP/1.1 200 8642 - Mozilla/5.0(兼容;\ Baiduspider/2.0;http://www . Baidu . com/search/spider . html) pattern= (?Pip[\d.]{3,})-\[(?Ptime。*)\] (\w ) (\S)(。*) (\d \d ) - (?Puseragent。*) regex=re . compile(pattern)def extract(log:str):m=regex . match(log)if m:print(m . groups())print( IP:{ } 。格式(m.group(ip )),时间:{} 。格式(m.group(time )), useragent :{} 。format(m.group(useragent )),sep= )提取

  用上面的分组提取所有想要的组,也就是我们想要的数据。为了方便起见,可以使用命名分组。

  绘图

  命名每个字段,然后对应值和类型转换的方法。

  最简单的方法是使用正则表达式进行分组。

  import RES= 123 . 125 . 71 . 36---[06/Apr/2017:18:09:25 0800] GET/HTTP/1.1 200 8642 - Mozilla/5.0(兼容;\ Baiduspider/2.0;http://www . Baidu . com/search/spider . html) pattern= (?Pip[\d.]{3,})-\[(?Ptime。*)\] (\w ) (\S)(。*) (\d \d ) - (?PuserAgent。*) regex=re.pillar (pattern) #使用映射将获得的结果转换为所需的类型Con={ datetime :lambda time:datetime . datetime . strptime(time, % d/%b/%y:% h:% m:% s } #这里的示例只转换时间def c(long:str):m=regex . match(long)if m:return { k:Con . get(k,lambda x: x) (v) for k,v in m. groupdict()。items ()}打印(c (s))

  异常处理

  日志中难免会有一些不匹配的行,需要处理。这里使用了re.match方法,可能不匹配。你需要添加一个判断,抛出一个异常让调用者活异常,自己处理。

  import RES= 123 . 125 . 71 . 36---[06/Apr/2017:18:09:25 0800] GET/HTTP/1.1 200 8642 - Mozilla/5.0(兼容;\ Baiduspider/2.0;http://www . Baidu . com/search/spider . html) pattern= (?Pip[\d.]{3,})-\[(?Ptime。*)\] (\w ) (\S)(。*) (\d \d ) - (?Puseragent。*) regex=re . compile(pattern)con={ time :lambda time:datetime . datetime . strptime(time, %d/%b/%Y:%H:%M:%S %z ),} def c(long:str):M=regex . match(long)if M:return { k:con . get(k,lambda x: x)(v) for k,V m. Groupdict()。Items ()} #考虑不匹配else的情况:#使用error # raisee exception( no match。{}.format (s)) #使用特殊值return none print(c(s))def load(path):with open(path)as f:for line in

  对于这个项目来说,数据是日志的记录,加载数据是文件IO的读取,将采集到的数据的防范封装到一个函数中。

  def load(path):with open(path)as f:for line in f:fields=extract(line)if字段:产量字段否则:继续日志文件的加载

  目前实现的代码中,只能接受一个路径,修改为接受一批路径。

  可以约定一个路径下文件的存放形式:

  如果送来的是一批路径,就迭代其中路径。如果路径是一个普通的文件,就直接加载这个文件。如果路径是一个目录,就便利路径下所有指定类型的文件,每一个我呢见按照行处理,可以提供参数处理是否递归子目录从pathlib导入Pathdef load(*paths,encoding=utf-8 ,ext=* .log ,recursive=False):对于路径中的x:p=Path(x)#目录处理if p.is_dir(): if isinstance(ext,str):ext=[ext]else:ext=list(ext)for e in ext:files=p . rg lob(e)if recursive else p . glob(e)yield from loadfile(str(file .absolute()),encoding=encoding)elif p . is _ file():yield from loadfile(str(file。absolute()),编码=编码)完整代码

  从路径库导入路径导入日期时间导入repattern= (?Pip[\d.]{3,})-\[(?Ptime .*)\] (\w ) (\S)(.*) (\d \d ) - (?Puseragent .*) regex=re。编译(模式)转换={ datetime :lambda timestr:datetime。日期时间。strptime(timestr, % d % b % Y:% H:% M:% S % z )}定义提取(日志行:str)-字典: 返回字段的字典,如果返回没有人说明匹配失败 m=正则表达式。如果m:return { k:conversion,则匹配(日志行)。get(k,lambda x :x)(v)for k,v in m.groupdict().items()}其他:返回无#或输出日志记录定义加载文件(文件名:str,编码=utf-8 ): 装载日志文件 with open(filename,encoding=encoding)as f:for line in f:fields=extract(lien)if fields:yield fields else:continue from path lib import path def load(* paths,encoding=utf-8 ,ext=* .log ,recursive=False): 装载日志文件对于路径中的x:p=Path(x)#目录处理if p.is_dir(): #处理目录if isinstance(ext,str):ext=[ext]else:ext=list(ext)for e in ext:files=p . rg lob(e)if递归else p . glob(e)yield from loadfile(str(file。absolute()),encoding=encoding)elif p . is _ file():yield from loadfile(str(file。absolute()),编码=编码)

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: