暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

日志收集原理

北漂悟道之路 2019-06-26
1090


日志收集原理

基于python实现

作为一个运维工程师,一定得熟悉ELK,熟悉ELK,得了解日志是怎么收集的。





    

 


什么是日志收集?


顾名思义,对日志的逐一采集,对不同日志的分类,实现日志的统一处理。

   在实际的工作中,日志收集的业务场景比比皆是,例如hadoop集群的日志集中化,kubernetes集群的日志集中化,云主机业务集群日志集中化等。



  

    如何实现日志的采集?


    换句话,日志收集有哪几种方式,讲采集之前,先普及一下有哪  几种日志形式,目前熟悉的就是两种。


    1、写日志文件。


    2、写socket报文。





  

    从日志文件中收集日志


设计模式:日志 -> 采集器 -> kafka。


基本功能:


    按块获取日志,每批次获取1M或者512kb。

    触发发送的条件,时间或者文件大小达标。

    记录offset。

    设定offset为最后一个回车换行。

    记录redo信息。

    过滤不采集的数据。


获取日志文件时的增量信息:


    从记录的offset开始读取。

    如果没有offset,从0开始读取。

    发送日志时,记下每次的offset。


获取历史日志文件信息。


    不走redo,根据输入的日期收集。


异常情况:


    程序重启时,读取上次记录的offset,如果跨天,从当天最新的开始读取。




  

    从socket获取报文信息



Tips

设计模式:日志 -> 接口 -> 持久化并处理后落入指定的数据库。


基本功能:

    

    通过制定端口传输日志,为实现对底层数据库的保护,将接收到的数据持久化(类似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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论