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

  1. # !/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from .base import BasePlugin
  4. import os,re
  5. import traceback
  6. from lib.response import BaseReponse
  7. class Disk(BasePlugin):
  8. def win(self,handler,hostname):
  9. '''
  10. 执行命令拿到结果-磁盘
  11. :return:
  12. '''
  13. print("执行win方法")
  14. ret = handler.cmd('wmic diskdrive',hostname)[0:10]
  15. return ret
  16. # def linux(self,handler,hostname):
  17. # '''
  18. # 执行命令拿到结果-磁盘
  19. # :return:
  20. # '''
  21. # print("执行Linux方法")
  22. #
  23. # ret = handler.cmd('df -h',hostname)[0:10]
  24. # return ret
  25. def linux(self, handler, hostname):
  26. '''
  27. 采集数据
  28. :param handler:
  29. :param hostname:
  30. :return:
  31. '''
  32. #实现错误信息记录,标记,post 提交到服务端,首先定义一个字典如下:
  33. # result = {'status':True,'error':None,'data':None}
  34. #字典的形式使用比较麻烦,所有这里在lib 文件中定义一个类来使用,看起比较高端些,使用方法是
  35. '''
  36. 这里是在 lib 文件实现的,使用的时候记得导入模块
  37. class BaseReponse():
  38. def __init__(self):
  39. self.status = True
  40. self.error = None
  41. self.data = None
  42. #调用内部方法 静态方法属性
  43. @property
  44. def dict(self):
  45. return self.__dict__
  46. '''
  47. reponse = BaseReponse()
  48. try :
  49. if self.debug:
  50. output = open(os.path.join(self.base_dir, 'files', 'disk.out'), 'r').read()
  51. else:
  52. shell_command = "sudo MegaCli -PDList -aALL" #根据执行的命令
  53. output = handler.cmd(shell_command, hostname)
  54. reponse.data = self.parse(output)
  55. except Exception as e:
  56. error_msg = traceback.format_exc()
  57. reponse.status = False
  58. reponse.error = error_msg
  59. return reponse.dict
  60.  
  61. def parse(self, content):
  62. """
  63. 解析shell命令返回结果
  64. :param content: shell 命令结果
  65. :return:解析后的结果
  66. """
  67. response = {}
  68. result = []
  69. for row_line in content.split("\n\n\n\n"):
  70. result.append(row_line)
  71. for item in result:
  72. temp_dict = {}
  73. for row in item.split('\n'):
  74. if not row.strip():
  75. continue
  76. if len(row.split(':')) != 2:
  77. continue
  78. key, value = row.split(':')
  79. name = self.mega_patter_match(key)
  80. if name:
  81. if key == 'Raw Size':
  82. raw_size = re.search('(\d+\.\d+)', value.strip())
  83. if raw_size:
  84. temp_dict[name] = raw_size.group()
  85. else:
  86. raw_size = ''
  87. else:
  88. temp_dict[name] = value.strip()
  89. if temp_dict:
  90. response[temp_dict['slot']] = temp_dict
  91. return response
  92.  
  93. @staticmethod
  94. def mega_patter_match(needle):
  95. grep_pattern = {'Slot': 'slot', 'Raw Size': 'capacity', 'Inquiry': 'model', 'PD Type': 'pd_type'}
  96. for key, value in grep_pattern.items():
  97. if needle.startswith(key):
  98. return value
  99. return False

看见截图

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

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

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

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

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

导入loging 到日配置文件

  1. import logging
  2. from config import settings
  3.  
  4. # file_handler = logging.FileHandler('xxxxxxxx.log', 'a', encoding='utf-8')
  5. # file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s: %(message)s"))
  6. #
  7. # logger = logging.Logger('s1', level=logging.INFO)
  8. # logger.addHandler(file_handler)
  9. #
  10. # logger.info('1111')
  11. # logger.error('2222')
  12.  
  13. class Logger:
  14. def __init__(self):
  15. self.path = settings.LOG_FILE_PATH
  16. file_handler = logging.FileHandler(self.path, 'a', encoding='utf-8')
  17. fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
  18. file_handler.setFormatter(fmt)
  19.  
  20. self.logger = logging.Logger('cmdb',level=logging.INFO)
  21. self.logger.addHandler(file_handler)
  22.  
  23. def info(self,msg):
  24. self.logger.info(msg)
  25.  
  26. def error(self,mag):
  27. self.logger.error(mag)
  28.  
  29. logger = Logger()

disk 采集文件实现代码如下

  1. # !/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from .base import BasePlugin
  4. import os,re
  5. import traceback
  6. from lib.response import BaseReponse
  7. from lib.log import logger
  8.  
  9. class Disk(BasePlugin):
  10. def win(self,handler,hostname):
  11. '''
  12. 执行命令拿到结果-磁盘
  13. :return:
  14. '''
  15. print("执行win方法")
  16. ret = handler.cmd('wmic diskdrive',hostname)[0:10]
  17. return ret
  18. # def linux(self,handler,hostname):
  19. # '''
  20. # 执行命令拿到结果-磁盘
  21. # :return:
  22. # '''
  23. # print("执行Linux方法")
  24. #
  25. # ret = handler.cmd('df -h',hostname)[0:10]
  26. # return ret
  27. def linux(self, handler, hostname):
  28. '''
  29. 采集数据
  30. :param handler:
  31. :param hostname:
  32. :return:
  33. '''
  34. #实现错误信息记录,标记,post 提交到服务端,首先定义一个字典如下:
  35. # result = {'status':True,'error':None,'data':None}
  36. #字典的形式使用比较麻烦,所有这里在lib 文件中定义一个类来使用,看起比较高端些,使用方法是
  37. '''
  38. 这里是在 lib 文件实现的
  39. class BaseReponse():
  40. def __init__(self):
  41. self.status = True
  42. self.error = None
  43. self.data = None
  44. #调用内部方法 静态方法属性
  45. @property
  46. def dict(self):
  47. return self.__dict__
  48. '''
  49. reponse = BaseReponse()
  50. try :
  51. if self.debug:
  52. output = open(os.path.join(self.base_dir, 'files', 'disk.out'), 'r').read()
  53. else:
  54. shell_command = "sudo MegaCli -PDList -aALL" #根据执行的命令
  55. output = handler.cmd(shell_command, hostname)
  56. reponse.data = self.parse(output)
  57. except Exception as e:
  58. error_msg = traceback.format_exc()
  59. reponse.status = False
  60. reponse.error = error_msg
  61. # 记录错误日志
  62. logger.error(error_msg)
  63. return reponse.dict
  64.  
  65. def parse(self, content):
  66. """
  67. 解析shell命令返回结果
  68. :param content: shell 命令结果
  69. :return:解析后的结果
  70. """
  71. response = {}
  72. result = []
  73. for row_line in content.split("\n\n\n\n"):
  74. result.append(row_line)
  75. for item in result:
  76. temp_dict = {}
  77. for row in item.split('\n'):
  78. if not row.strip():
  79. continue
  80. if len(row.split(':')) != 2:
  81. continue
  82. key, value = row.split(':')
  83. name = self.mega_patter_match(key)
  84. if name:
  85. if key == 'Raw Size':
  86. raw_size = re.search('(\d+\.\d+)', value.strip())
  87. if raw_size:
  88. temp_dict[name] = raw_size.group()
  89. else:
  90. raw_size = ''
  91. else:
  92. temp_dict[name] = value.strip()
  93. if temp_dict:
  94. response[temp_dict['slot']] = temp_dict
  95. return response
  96.  
  97. @staticmethod
  98. def mega_patter_match(needle):
  99. grep_pattern = {'Slot': 'slot', 'Raw Size': 'capacity', 'Inquiry': 'model', 'PD Type': 'pd_type'}
  100. for key, value in grep_pattern.items():
  101. if needle.startswith(key):
  102. return value
  103. return False

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

CMDB学习之七-实现采集错误捕捉,日志信息处理的更多相关文章

  1. Django项目:CMDB(服务器硬件资产自动采集系统)--12--08CMDB采集硬件数据日志记录

    #settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...

  2. 【Flask】 python学习第一章 - 3.0 正则转换和错误捕捉

    3.1正则转换器定义 Class RegexConverter(BaseConverter): regex = "[0-9]{6}" app.url_map.converters[ ...

  3. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  4. 别人的的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  5. 学习了解PHP中的SeasLog日志扩展

    今天来学习的扩展是和日志相关的一个扩展,对于 PHP 的日志应用来说,除了本身自带的 error_log() . syslog() 之外,在大多数的框架中还会经常见到 monolog 的踪影.当然,我 ...

  6. minicom/kermit捕捉日志

    1.minicom捕捉日志 ctrl-A Z 命令窗口中有 Capture on/off......L   2.kermit捕捉日志 ctrl-\ C进入kermit命令行模式 log session ...

  7. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

  8. 应用Flume+HBase采集和存储日志数据

    1. 在本方案中,我们要将数据存储到HBase中,所以使用flume中提供的hbase sink,同时,为了清洗转换日志数据,我们实现自己的AsyncHbaseEventSerializer. pac ...

  9. 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题

    背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视. 所以在我们前端开发完成后,会有一些列的web应用的上线验证,如自测.QA测试.code review 等 ...

随机推荐

  1. less03 混合

    less //基本混合 .font_hn{ color: red; font-family: microsoft yahei, "黑体", Arial, Simsun, " ...

  2. jsp输出九九乘法表

    <% String st = ""; for(int i = 1; i <= 9; i++){ for(int j = 1; j <= i; j++){ st + ...

  3. 外部样式表声明的样式并不会进入style对象

    在网页设计当中,我们注重网页的行为(js).结构(HTLM).样式(css)分离开 内联样式表或者内部样式表声明的样式信息都会进入style对象. 我们可以测试一下: 但是我们的外部样式表,也就是通过 ...

  4. css五种定位方式介绍

    1.static定位(普通流定位) -------------- 默认定位 2.float定位(浮动定位) 例:float:left; 有两个取值:left(左浮动)和right(右浮动).浮动元素会 ...

  5. <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 ...

  6. SSM中使用POI实现excel的导入导出

    环境:导入POI对应的包 环境: Spring+SpringMVC+Mybatis POI对应的包 <dependency> <groupId>org.apache.poi&l ...

  7. centeros安装jdk

    准备工作: java se下载网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...

  8. python3 geohash 导入错误及解决

    方法一: pip3 install  python-geohash 方法二: 1.保证 pip3 install geohash 包 2. 进入包的下载目录 /usr/local/lib/python ...

  9. 【BZOJ 1047】[HAOI2007]理想的正方形

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二维的ST表. 每个大的正方形可以由4个小的正方形组成. 然后区域内的最大值最小值.也可以由4个小的张方形部分全部覆盖到. [代码] ...

  10. ArcGIS api for javascript——地图配置-

    描述 本例展示了如果删除缩放等级滑动器的刻度线.通过设置esriConfig里的sliderLabel为null来实现: esriConfig.defaults.map.sliderLabel = n ...