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 等 ...
随机推荐
- C++ Primer笔记13_运算符重载_总结
总结: 1.不能重载的运算符: . 和 .* 和 ?: 和 :: 和 sizeof 和 typeid 2.重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则例如以下: 运算符 建议使用 ...
- C++归并排序总结
#include <iostream> using namespace std; //归并排序非递归版. void Sort(int a[], int n,int high) { int ...
- LeetCode 之 Merge Sorted Array(排序)
[问题描写叙述] Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array ...
- 小贝_redis list类型学习
redis list类型 一.查看list类型的命令 二.list命令具体解释 一.查看list类型的命令 1.在终端数据 help @list 127.0.0.1:6379>help @li ...
- 7.配置文件mocha.opts
转自:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html Mocha允许在test目录下面,放置配置文件m ...
- 2013亚洲区域赛长沙站 ZOJ 3732 Graph Reconstruction
题目链接 Graph Reconstruction 题意 给你无向图每个点的度数, 问是否存在唯一解, 存在输出唯一解, 多解输出两个, 无解输出IMPOSSIBLE 思路 这里用到了 Havel-H ...
- Oracle 常用内置函数
--绝对值 ) --求模 ,) --取整 --四舍五入 )from dual;--123.5 ) --截取 )from dual;--123.4 ) --字符串长度 --截取 select st.sn ...
- Swift学习笔记(3):基本运算符
目录: 运算符 元组比较 空和运算符 区间运算符 运算符 +, -, *, /, %, =, +=, -=, *=, /= 算术运算符 >, <, ==, >=, <=, != ...
- 机器学习(七) PCA与梯度上升法 (上)
一.什么是PCA 主成分分析 Principal Component Analysis 一个非监督学的学习算法 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征 其他应用:可视化:去噪 第一 ...
- BootStrap--panel面板
1 <div class="panel panel-default"> <div class="panel-body"> 这是一个基本的 ...