日志收集原理
♪
基于python实现
作为一个运维工程师,一定得熟悉ELK,熟悉ELK,得了解日志是怎么收集的。

顾名思义,对日志的逐一采集,对不同日志的分类,实现日志的统一处理。
在实际的工作中,日志收集的业务场景比比皆是,例如hadoop集群的日志集中化,kubernetes集群的日志集中化,云主机业务集群日志集中化等。

如何实现日志的采集?
换句话,日志收集有哪几种方式,讲采集之前,先普及一下有哪 几种日志形式,目前熟悉的就是两种。
1、写日志文件。
2、写socket报文。
从日志文件中收集日志

设计模式:日志 -> 采集器 -> kafka。
基本功能:
按块获取日志,每批次获取1M或者512kb。
触发发送的条件,时间或者文件大小达标。
记录offset。
设定offset为最后一个回车换行。
记录redo信息。
过滤不采集的数据。
获取日志文件时的增量信息:
从记录的offset开始读取。
如果没有offset,从0开始读取。
发送日志时,记下每次的offset。
获取历史日志文件信息。
不走redo,根据输入的日期收集。
异常情况:
程序重启时,读取上次记录的offset,如果跨天,从当天最新的开始读取。
从socket获取报文信息
设计模式:日志 -> 接口 -> 持久化并处理后落入指定的数据库。
基本功能:
通过制定端口传输日志,为实现对底层数据库的保护,将接收到的数据持久化(类似kakfa的功能)。
代码
1class LogCollection(object):
2 def __init__(self, redopath = None, redo = None , separate = None):
3 self.std_err = "I am error"
4 self.redopath = redopath
5 self.redo = redo
6 self.separate = separate
7 self.fileoffset = {}
8
9 # clean the session of two day ago
10 def cleansession(self, yesteday = 0, today = 0):
11
12 yesteday = (datetime.date.today() - datetime.timedelta(days = 1)).strftime("%Y%m%d")
13 today = datetime.datetime.now().strftime('%Y%m%d')
14 if self.fileoffset != {}:
15 for key,value in self.fileoffset.items():
16 if re.search(yesteday, key) or re.search(today,key):
17 pass
18 else:
19 del self.fileoffset[key]
20
21 def logcollection(self, filename,mod,encode):
22 fp = open(filename, mode=mod, encoding=encode)
23 alllinetxt = ""
24 if filename in self.fileoffset:
25
26 fp.seek(int(self.fileoffset[filename]),0)
27 logging.info("%s is offset is %s",filename,self.fileoffset[filename])
28 elif self.fileoffset == {}:
29 Publiclib.readsession(self.fileoffset, self.redopath, self.redo, self.separate)
30 logging.info("fileoffset is none")
31 if self.fileoffset != {} and filename in self.fileoffset:
32 fp.seek(int(self.fileoffset[filename]),0)
33 logging.info("%s is offset is %s", filename, self.fileoffset[filename])
34 filter = "xxx"
35 line = fp.readline()
36 while re.search("\n",line):
37 if not filter or not re.search(filter, line):
38 alllinetxt += line
39 self.fileoffset[filename] = fp.tell()
40 line = fp.readline()
41 fp.close()
42 session = ""
43 for key in self.fileoffset:
44 session += key + ";" + str(self.fileoffset[key]) +";" + "\n"
45 if Publiclib.writesession(session,self.redopath,self.redo) == 1:
46 logging.info("Successfully written to the file!!!")
47 else:
48 logging.info("failed written to the file")
49
50 return alllinetxt
51
52 def writelog(self,filename,linetxt):
53 with open(filename, 'w',encoding="UTF-8") as fp:
54 fp.writelines(linetxt)
55 fp.close()


文章转载自北漂悟道之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




