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("\n\n\n\n"):
- result.append(row_line)
- for item in result:
- temp_dict = {}
- for row in item.split('\n'):
- 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 = ''
- 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("\n\n\n\n"):
- result.append(row_line)
- for item in result:
- temp_dict = {}
- for row in item.split('\n'):
- 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 = ''
- 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
其它的采集插件依次方法实现
CMDB学习之七-实现采集错误捕捉,日志信息处理的更多相关文章
- Django项目:CMDB(服务器硬件资产自动采集系统)--12--08CMDB采集硬件数据日志记录
#settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...
- 【Flask】 python学习第一章 - 3.0 正则转换和错误捕捉
3.1正则转换器定义 Class RegexConverter(BaseConverter): regex = "[0-9]{6}" app.url_map.converters[ ...
- 我的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 别人的的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 学习了解PHP中的SeasLog日志扩展
今天来学习的扩展是和日志相关的一个扩展,对于 PHP 的日志应用来说,除了本身自带的 error_log() . syslog() 之外,在大多数的框架中还会经常见到 monolog 的踪影.当然,我 ...
- minicom/kermit捕捉日志
1.minicom捕捉日志 ctrl-A Z 命令窗口中有 Capture on/off......L 2.kermit捕捉日志 ctrl-\ C进入kermit命令行模式 log session ...
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
- 应用Flume+HBase采集和存储日志数据
1. 在本方案中,我们要将数据存储到HBase中,所以使用flume中提供的hbase sink,同时,为了清洗转换日志数据,我们实现自己的AsyncHbaseEventSerializer. pac ...
- 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题
背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视. 所以在我们前端开发完成后,会有一些列的web应用的上线验证,如自测.QA测试.code review 等 ...
随机推荐
- less03 混合
less //基本混合 .font_hn{ color: red; font-family: microsoft yahei, "黑体", Arial, Simsun, " ...
- jsp输出九九乘法表
<% String st = ""; for(int i = 1; i <= 9; i++){ for(int j = 1; j <= i; j++){ st + ...
- 外部样式表声明的样式并不会进入style对象
在网页设计当中,我们注重网页的行为(js).结构(HTLM).样式(css)分离开 内联样式表或者内部样式表声明的样式信息都会进入style对象. 我们可以测试一下: 但是我们的外部样式表,也就是通过 ...
- css五种定位方式介绍
1.static定位(普通流定位) -------------- 默认定位 2.float定位(浮动定位) 例:float:left; 有两个取值:left(左浮动)和right(右浮动).浮动元素会 ...
- <Sicily>Tiling a Grid With Dominoes
一.题目描述 We wish to tile a grid 4 units high and N units long with rectangles (dominoes) 2 units by on ...
- SSM中使用POI实现excel的导入导出
环境:导入POI对应的包 环境: Spring+SpringMVC+Mybatis POI对应的包 <dependency> <groupId>org.apache.poi&l ...
- centeros安装jdk
准备工作: java se下载网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...
- python3 geohash 导入错误及解决
方法一: pip3 install python-geohash 方法二: 1.保证 pip3 install geohash 包 2. 进入包的下载目录 /usr/local/lib/python ...
- 【BZOJ 1047】[HAOI2007]理想的正方形
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二维的ST表. 每个大的正方形可以由4个小的正方形组成. 然后区域内的最大值最小值.也可以由4个小的张方形部分全部覆盖到. [代码] ...
- ArcGIS api for javascript——地图配置-
描述 本例展示了如果删除缩放等级滑动器的刻度线.通过设置esriConfig里的sliderLabel为null来实现: esriConfig.defaults.map.sliderLabel = n ...