zoukankan      html  css  js  c++  java
  • CMDB学习之七-实现采集错误捕捉,日志信息处理

    首先采集disk的具体实现方上代码:

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-
    from .base import BasePlugin
    import os,re
    import traceback
    from lib.response import BaseReponse
    class Disk(BasePlugin):
        def win(self,handler,hostname):
            '''
            执行命令拿到结果-磁盘
            :return:
            '''
            print("执行win方法")
            ret = handler.cmd('wmic diskdrive',hostname)[0:10]
            return ret
        # def linux(self,handler,hostname):
        #     '''
        #     执行命令拿到结果-磁盘
        #     :return:
        #     '''
        #     print("执行Linux方法")
        #
        #     ret = handler.cmd('df -h',hostname)[0:10]
        #     return ret
        def linux(self, handler, hostname):
            '''
            采集数据
            :param handler:
            :param hostname:
            :return:
            '''
            #实现错误信息记录,标记,post 提交到服务端,首先定义一个字典如下:
            # result = {'status':True,'error':None,'data':None}
            #字典的形式使用比较麻烦,所有这里在lib 文件中定义一个类来使用,看起比较高端些,使用方法是
            '''
            这里是在 lib 文件实现的,使用的时候记得导入模块
            class BaseReponse():
        def __init__(self):
            self.status = True
            self.error = None
            self.data = None
        #调用内部方法 静态方法属性
        @property
        def dict(self):
            return self.__dict__
            '''
            reponse = BaseReponse()
            try :
                if self.debug:
                    output = open(os.path.join(self.base_dir, 'files', 'disk.out'), 'r').read()
                else:
                    shell_command = "sudo MegaCli  -PDList -aALL" #根据执行的命令
                    output = handler.cmd(shell_command, hostname)
                reponse.data = self.parse(output)
            except Exception as e:
                error_msg = traceback.format_exc()
                reponse.status = False
                reponse.error = error_msg
            return reponse.dict
    
        def parse(self, content):
            """
            解析shell命令返回结果
            :param content: shell 命令结果
            :return:解析后的结果
            """
            response = {}
            result = []
            for row_line in content.split("
    
    
    
    "):
                result.append(row_line)
            for item in result:
                temp_dict = {}
                for row in item.split('
    '):
                    if not row.strip():
                        continue
                    if len(row.split(':')) != 2:
                        continue
                    key, value = row.split(':')
                    name = self.mega_patter_match(key)
                    if name:
                        if key == 'Raw Size':
                            raw_size = re.search('(d+.d+)', value.strip())
                            if raw_size:
                                temp_dict[name] = raw_size.group()
                            else:
                                raw_size = '0'
                        else:
                            temp_dict[name] = value.strip()
                if temp_dict:
                    response[temp_dict['slot']] = temp_dict
            return response
    
        @staticmethod
        def mega_patter_match(needle):
            grep_pattern = {'Slot': 'slot', 'Raw Size': 'capacity', 'Inquiry': 'model', 'PD Type': 'pd_type'}
            for key, value in grep_pattern.items():
                if needle.startswith(key):
                    return value
            return False

    看见截图

    按照上面采集磁盘的方法,在其它的 网卡,cpu 。内存 去实现下

    #######################

    下面是错误日志记录 ,是loging 模块实现,思路是让每次报错的是日志信息写入到文件中

    按照原来思路,把功能写到lib 目录中进行掉用

    配置文件中添加一个记录文件日志的路径配置信息

     导入loging 到日配置文件

    import logging
    from config import settings
    
    
    # file_handler = logging.FileHandler('xxxxxxxx.log', 'a', encoding='utf-8')
    # file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s:  %(message)s"))
    #
    # logger = logging.Logger('s1', level=logging.INFO)
    # logger.addHandler(file_handler)
    #
    # logger.info('1111')
    # logger.error('2222')
    
    
    
    class Logger:
        def __init__(self):
            self.path = settings.LOG_FILE_PATH
            file_handler = logging.FileHandler(self.path, 'a', encoding='utf-8')
            fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
            file_handler.setFormatter(fmt)
    
            self.logger = logging.Logger('cmdb',level=logging.INFO)
            self.logger.addHandler(file_handler)
    
    
        def info(self,msg):
            self.logger.info(msg)
    
        def error(self,mag):
            self.logger.error(mag)
    
    
    logger = Logger()

     disk 采集文件实现代码如下

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-
    from .base import BasePlugin
    import os,re
    import traceback
    from lib.response import BaseReponse
    from lib.log import logger
    
    class Disk(BasePlugin):
        def win(self,handler,hostname):
            '''
            执行命令拿到结果-磁盘
            :return:
            '''
            print("执行win方法")
            ret = handler.cmd('wmic diskdrive',hostname)[0:10]
            return ret
        # def linux(self,handler,hostname):
        #     '''
        #     执行命令拿到结果-磁盘
        #     :return:
        #     '''
        #     print("执行Linux方法")
        #
        #     ret = handler.cmd('df -h',hostname)[0:10]
        #     return ret
        def linux(self, handler, hostname):
            '''
            采集数据
            :param handler:
            :param hostname:
            :return:
            '''
            #实现错误信息记录,标记,post 提交到服务端,首先定义一个字典如下:
            # result = {'status':True,'error':None,'data':None}
            #字典的形式使用比较麻烦,所有这里在lib 文件中定义一个类来使用,看起比较高端些,使用方法是
            '''
            这里是在 lib 文件实现的
            class BaseReponse():
        def __init__(self):
            self.status = True
            self.error = None
            self.data = None
        #调用内部方法 静态方法属性
        @property
        def dict(self):
            return self.__dict__
            '''
            reponse = BaseReponse()
            try :
                if self.debug:
                    output = open(os.path.join(self.base_dir, 'files', 'disk.out'), 'r').read()
                else:
                    shell_command = "sudo MegaCli  -PDList -aALL" #根据执行的命令
                    output = handler.cmd(shell_command, hostname)
                reponse.data = self.parse(output)
            except Exception as e:
                error_msg = traceback.format_exc()
                reponse.status = False
                reponse.error = error_msg
                # 记录错误日志
                logger.error(error_msg)
            return reponse.dict
    
        def parse(self, content):
            """
            解析shell命令返回结果
            :param content: shell 命令结果
            :return:解析后的结果
            """
            response = {}
            result = []
            for row_line in content.split("
    
    
    
    "):
                result.append(row_line)
            for item in result:
                temp_dict = {}
                for row in item.split('
    '):
                    if not row.strip():
                        continue
                    if len(row.split(':')) != 2:
                        continue
                    key, value = row.split(':')
                    name = self.mega_patter_match(key)
                    if name:
                        if key == 'Raw Size':
                            raw_size = re.search('(d+.d+)', value.strip())
                            if raw_size:
                                temp_dict[name] = raw_size.group()
                            else:
                                raw_size = '0'
                        else:
                            temp_dict[name] = value.strip()
                if temp_dict:
                    response[temp_dict['slot']] = temp_dict
            return response
    
        @staticmethod
        def mega_patter_match(needle):
            grep_pattern = {'Slot': 'slot', 'Raw Size': 'capacity', 'Inquiry': 'model', 'PD Type': 'pd_type'}
            for key, value in grep_pattern.items():
                if needle.startswith(key):
                    return value
            return False

    其它的采集插件依次方法实现

  • 相关阅读:
    一个喜欢研究车的80后开车人,自己的经验和感受
    35岁前务必成功的12级跳(男女通用) 转
    如何注册ocx文件
    plsql连接oracle数据库
    float过后 高度无法自适应的解决方法
    Mysql 中文中繁杂的字 插入报错的 解决方案
    power designer 教程
    表单文本框输入时提示文字消失
    diskpart分盘代码
    linux svn 中文 https://my.oschina.net/VASKS/blog/659236
  • 原文地址:https://www.cnblogs.com/michael2018/p/10505079.html
Copyright © 2011-2022 走看看