iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用Python对Syslog信息进行分析并绘图的实现
  • 567
分享到

使用Python对Syslog信息进行分析并绘图的实现

2024-04-02 19:04:59 567人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

实验目的: 对设备Syslong信息进行分析记录,并写入sqlite数据库中;后续读取数据库的信息,对Syslog的严重级别分布、来源进行分析进行分析。 同时监控O

实验目的:

  • 对设备Syslong信息进行分析记录,并写入sqlite数据库中;后续读取数据库的信息,对Syslog的严重级别分布、来源进行分析进行分析。
  • 同时监控OSPF的状态信息,状态一旦改变,进行告警。

实验结果:

监控Syslog的严重级别分布,和日志源分布,并绘图:

在这里插入图片描述

在这里插入图片描述

监控OSPF状态信息:

在这里插入图片描述

实验环境:

两台CSR1000v,完成Syslog(其中一台)和OSPF的配置:

logging hosy x.x.x.x /将Syslong日志信息发送给目的主机(运行python)进行处理。

logging trap debugging /监控所有级别的Syslog信息。

ospf配置略。

 Python脚本:

脚本一:监控CSR1000v发送的Syslog Trap信息,并对信息进行分词处理,写入数据库。同时监控OSPF邻居状态是否改变。


import Socketserver
import re
from dateutil import parser
import os
import sqlite3

# facility与ID的对应关系的字典,方便后续分词时提取对应的信息
facility_dict = {0: 'KERN',
                 1: 'USER',
                 2: 'MaiL',
                 3: 'DAEMON',
                 4: 'AUTH',
                 5: 'SYSLOG',
                 6: 'LPR',
                 7: 'NEWS',
                 8: 'UUCP',
                 9: 'CRON',
                 10: 'AUTHPRIV',
                 11: 'FTP',
                 16: 'LOCAL0',
                 17: 'LOCAL1',
                 18: 'LOCAL2',
                 19: 'LOCAL3',
                 20: 'LOCAL4',
                 21: 'LOCAL5',
                 22: 'LOCAL6',
                 23: 'LOCAL7'}

# severity_level与ID的对应关系的字典,方便后续分词时提取对应的信息
severity_level_dict = {0: 'EMERG',
                       1: 'ALERT',
                       2: 'CRIT',
                       3: 'ERR',
                       4: 'WARNING',
                       5: 'NOTICE',
                       6: 'INFO',
                       7: 'DEBUG'}

# 分词处理的类
class SyslogUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = bytes.decode(self.request[0].strip())  # 读取数据
        # print(data)
        syslog_info_dict = {'device_ip': self.client_address[0]}
        try:
            # syslog信息如下:<187>83: *Apr  4 00:03:12.969: %LINK-3-UPDOWN: Interface GigabitEthernet2, 
            # changed state to up,我们需要对此进行提炼分词,并将分词结果记入到一个字典里面;具体的分词过程简单了解即可
            syslog_info = re.match(r'^<(\d*)>(\d*): \*(.*): %(\w+)-(\d)-(\w+): (.*)', str(data)).groups()
            # print(syslog_info[0]) 提取为整数 例如 185
            # 185 二进制为 1011 1001
            # 前5位为facility  >> 3 获取前5位
            # 后3位为severity_level  & 0b111 获取后3位
            syslog_info_dict['facility'] = (int(syslog_info[0]) >> 3)
            syslog_info_dict['facility_name'] = facility_dict[int(syslog_info[0]) >> 3]
            syslog_info_dict['logid'] = int(syslog_info[1])
            syslog_info_dict['time'] = parser.parse(syslog_info[2])
            syslog_info_dict['log_source'] = syslog_info[3]
            syslog_info_dict['severity_level'] = int(syslog_info[4])
            syslog_info_dict['severity_level_name'] = severity_level_dict[int(syslog_info[4])]
            syslog_info_dict['description'] = syslog_info[5]
            syslog_info_dict['text'] = syslog_info[6]
        except AttributeError:
            # 有些日志会缺失%SYS-5-CONFIG_I, 造成第一个正则表达式无法匹配 , 也无法提取severity_level
            # 下面的icmp的debug就是示例
            # <191>91: *Apr  4 00:12:29.616: ICMP: echo reply rcvd, src 10.1.1.80, dst 10.1.1.253, topology BASE, dscp 0 topoid 0
            syslog_info = re.match(r'^<(\d*)>(\d*): \*(.*): (\w+): (.*)', str(data)).groups()
            print(syslog_info[0])
            syslog_info_dict['facility'] = (int(syslog_info[0]) >> 3)
            syslog_info_dict['facility_name'] = facility_dict[int(syslog_info[0]) >> 3]
            syslog_info_dict['logid'] = int(syslog_info[1])
            syslog_info_dict['time'] = parser.parse(syslog_info[2])
            syslog_info_dict['log_source'] = syslog_info[3]
            # 如果在文本部分解析不了severity_level, 切换到syslog_info[0]去获取
            # 185 二进制为 1011 1001
            # 前5位为facility  >> 3 获取前5位
            # 后3位为severity_level  & 0b111 获取后3位
            syslog_info_dict['severity_level'] = (int(syslog_info[0]) & 0b111)
            syslog_info_dict['severity_level_name'] = severity_level_dict[(int(syslog_info[0]) & 0b111)]
            syslog_info_dict['description'] = 'N/A'
            syslog_info_dict['text'] = syslog_info[4]
        # print(syslog_info_dict)
        # 根据分词后的字典进行分析,如果用正则表达式匹配到了OSPF状态有了改变,则打印告警信息
        if syslog_info_dict['log_source'] == 'OSPF':
            result_ospf = re.findall('(Process \d+), Nbr ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).+to (\w+)', syslog_info_dict['text'])[0]
            if result_ospf:
                print('OSPF '+result_ospf[0]+' Neighbor '+result_ospf[1]+' status '+result_ospf[2])
        # 将字典信息写入sqlite数据库中
        conn = sqlite3.connect(gl_dbname)
        cursor = conn.cursor()
        cursor.execute("insert into syslogdb (time, \
                                              device_ip, \
                                              facility, \
                                              facility_name, \
                                              severity_level, \
                                              severity_level_name, \
                                              logid, \
                                              log_source, \
                                              description, \
                                              text) values ('%s', '%s', %d, '%s', %d, '%s', %d, '%s', '%s', '%s')" % (
        syslog_info_dict['time'].strftime("%Y-%m-%d %H:%M:%S"),
        syslog_info_dict['device_ip'],
        syslog_info_dict['facility'],
        syslog_info_dict['facility_name'],
        syslog_info_dict['severity_level'],
        syslog_info_dict['severity_level_name'],
        syslog_info_dict['logid'],
        syslog_info_dict['log_source'],
        syslog_info_dict['description'],
        syslog_info_dict['text'],
        ))
        conn.commit()


if __name__ == "__main__":
    # 使用linux解释器 & WIN解释器
    global gl_dbname
    gl_dbname = 'syslog.sqlite'
    if os.path.exists(gl_dbname):
        os.remove(gl_dbname)
    # 连接数据库
    conn = sqlite3.connect(gl_dbname)
    cursor = conn.cursor()
    # 创建数据库

    cursor.execute("create table syslogdb(id INTEGER PRIMARY KEY AUTOINCREMENT,\
                                         time varchar(64), \
                                         device_ip varchar(32),\
                                         facility int,\
                                         facility_name varchar(32),\
                                         severity_level int,\
                                         severity_level_name varchar(32),\
                                         logid int,\
                                         log_source varchar(32), \
                                         description varchar(128), \
                                         text varchar(1024)\
                                         )")
    conn.commit()
    try:
        HOST, PORT = "0.0.0.0", 514  # 本地地址与端口
        server = socketserver.UDPServer((HOST, PORT), SyslogUDPHandler)  # 绑定本地地址,端口和syslog处理方法
        print("Syslog 服务已启用, 写入日志到数据库!!!")
        server.serve_forever(poll_interval=0.5)  # 运行服务器,和轮询间隔

    except (IOError, SystemExit):
        raise
    except KeyboardInterrupt:  # 捕获Ctrl+C,打印信息并退出
        print("Crtl+C Pressed. Shutting down.")
    finally:
        conn.commit()

脚本二:读取数据库中的信息,并根据信息进行饼图绘制。


import sqlite3
from matplotlib import pyplot as plt
from syslog_server_to_db import severity_level_dict

# 绘制严重等级的饼图
def syslog_show_error_level_pie(dbname):
    # 连接数据库
    conn = sqlite3.connect(dbname)
    cursor = conn.cursor()
    # 提取安全级别和数量信息
    cursor.execute("select severity_level as level,COUNT(*) as count from syslogdb group by severity_level")
    yourresults = cursor.fetchall()

    level_list = []
    count_list = []

    # 把结果写入leve_list和count_list的列表
    for level_info in yourresults:
        level_list.append(severity_level_dict[level_info[0]])
        count_list.append(level_info[1])

    print(level_list)
    print([float(count) for count in count_list])

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文
    # 调节图形大小,宽,高
    plt.figure(figsize=(6, 6))

    # 使用count_list的比例来绘制饼图
    # 使用level_list作为注释
    patches, l_text, p_text = plt.pie(count_list,
                                      labels=level_list,
                                      labeldistance=1.1,
                                      autopct='%3.1f%%',
                                      shadow=False,
                                      startangle=90,
                                      pctdistance=0.6)

    # 改变文本的大小
    # 方法是把每一个text遍历。调用set_size方法设置它的属性
    for t in l_text:
        t.set_size = 30
    for t in p_text:
        t.set_size = 20
    # 设置x,y轴刻度一致,这样饼图才能是圆的
    plt.axis('equal')
    plt.title('SYSLOG严重级别分布图')  # 主题
    plt.legend()
    plt.show()

# 绘制Syslog来源的饼图
def syslog_show_source_pie(dbname):
    # 连接数据库
    conn = sqlite3.connect(dbname)
    cursor = conn.cursor()
    # 提取log源与其对应的数量
    cursor.execute("select log_source,COUNT(*) as count from syslogdb group by log_source")
    yourresults = cursor.fetchall()

    source_list = []
    count_list = []

    # 将数据库的信息,依次写入两个列表
    for source_info in yourresults:
        source_list.append(source_info[0])
        count_list.append(source_info[1])

    print(source_list)
    print([float(count) for count in count_list])

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文
    # 调节图形大小,宽,高
    plt.figure(figsize=(6, 6))

    # 使用count_list的比例来绘制饼图
    # 使用level_list作为注释
    patches, l_text, p_text = plt.pie(count_list,
                                      labels=source_list,
                                      labeldistance=1.1,
                                      autopct='%3.1f%%',
                                      shadow=False,
                                      startangle=90,
                                      pctdistance=0.6)

    # 改变文本的大小
    # 方法是把每一个text遍历。调用set_size方法设置它的属性
    for t in l_text:
        t.set_size = 30
    for t in p_text:
        t.set_size = 20
    # 设置x,y轴刻度一致,这样饼图才能是圆的
    plt.axis('equal')
    plt.title('日志源分布图')  # 主题
    plt.legend()
    plt.show()


if __name__ == '__main__':
    syslog_show_error_level_pie("syslog.sqlite")
    syslog_show_source_pie("syslog.sqlite")

参考资料来源:现任明教教主

到此这篇关于使用Python对Syslog信息进行分析并绘图的实现的文章就介绍到这了,更多相关Python Syslog分析 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用Python对Syslog信息进行分析并绘图的实现

本文链接: https://www.lsjlt.com/news/123965.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Python对Syslog信息进行分析并绘图的实现
    实验目的: 对设备Syslong信息进行分析记录,并写入sqlite数据库中;后续读取数据库的信息,对Syslog的严重级别分布、来源进行分析进行分析。 同时监控O...
    99+
    2024-04-02
  • 使用Python怎么对Syslog信息进行分析
    本篇文章给大家分享的是有关使用Python怎么对Syslog信息进行分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实验目的:对设备Syslong信息进行分析记录,并写入sq...
    99+
    2023-06-14
  • python 绘制斜率图进行对比分析
    你好,我是林骥。 斜率图,可以快速展现两组数据之间各维度的变化,特别适合用于对比两个时间点的数据。 比如说,为了对比分析某产品不同功能的用户满意度,经过问卷调查和数据统计,得到下面这...
    99+
    2024-04-02
  • python如何绘制斜率图进行对比分析
    这篇文章将为大家详细讲解有关python如何绘制斜率图进行对比分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。斜率图,可以快速展现两组数据之间各维度的变化,特别适合用于对比两个时间点的数据。比如说,为了...
    99+
    2023-06-14
  • python进行相关性分析并绘制散点图详解
    目录 需要用到的库数据读取总结近期,有小伙伴问我关于怎么使用python进行散点图的绘制,这个东西很简单,但是怎么讲相关性的值标注在图形上略显麻烦,因此,在这里记录一下,将...
    99+
    2024-04-02
  • 使用 python 进行微信好友分析
    使用 python 进行微信好友分析 1. 使用到的库 ① wxpy:初始化微信机器人 ② openpyxl:保存微信好友数据为Excel表格 ③ pyecharts:生成可视化的地图 ④ wordcloud、matplotlib、jie...
    99+
    2023-01-31
    好友 python
  • 13行python代码实现对微信进行推送消息的示例代码
    目录单人推送一对多推送Python可以实现给QQ邮箱、企业微信、微信等等软件推送消息,今天咱们实现一下Python直接给微信推送消息。 这里咱们使用了一个第三方工具pushplus ...
    99+
    2024-04-02
  • 对粘性定位的元素进行分析并进行实践探索
    粘性定位的要素分析与实践探索 随着互联网的快速发展,Web界面设计的重要性也日益凸显。在设计中,用户体验成为了最为重要的考量因素之一。而在许多网页和应用程序中,粘性定位(sticky positioning)成为了提高用户体验的...
    99+
    2024-01-29
    实践探索 粘性定位 要素分析
  • Python pyecharts实现绘制中国地图的实例分析
    这篇文章主要为大家分析了Python pyecharts实现绘制中国地图的实例分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Python&nb...
    99+
    2023-06-26
  • python数据分析matplotlib的基础绘图使用
    目录前言(一)什么是matplotlib1.为什么要学习matplotlib2.什么是matplotlib3. 安装matplotlib4.导入matplotlib库(二)matpl...
    99+
    2024-04-02
  • 使用Python对零售商品进行数据分析
    目录一、主要内容:二、使用工具三、数据来源四、字段含义五、数据清洗1、查看总体数据特征2、修改列名3、检验缺失数据4、查看并转换数据类型5、查看异常值并删除六、数据分析1、总体销量数...
    99+
    2024-04-02
  • spring boot对敏感信息进行加解密的项目实现
    我们使用jasypt最新版本对敏感信息进行加解密。 1.在项目pom文件中加入如下依赖: <dependency> <groupId&...
    99+
    2023-05-17
    springboot敏感信息加解密 springboot敏感信息加密
  • 使用pythonopencv对畸变图像进行矫正的实现
    代码: __Author__ = "Shliang" __Email__ = "shliang0603@gmail.com" import os import cv2 import...
    99+
    2024-04-02
  • 利用Python Matlab绘制曲线图的实例分析
    利用Python Matlab绘制曲线图的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、简介我们在这里采用Python中的matplotl...
    99+
    2023-06-22
  • 如何进行CentOS CPU使用率查看相应信息分析系统
    今天就跟大家聊聊有关如何进行CentOS CPU使用率查看相应信息分析系统,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在向大家详细介绍CentOS CPU之前,首先让大家了解下Ce...
    99+
    2023-06-16
  • 使用Python怎么实现自动提取并收集信息
    本篇文章给大家分享的是有关使用Python怎么实现自动提取并收集信息,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。代码实现导入需要的库,包括百度的api接口跟cv2图像截图图库...
    99+
    2023-06-15
  • Python实践之使用Pandas进行数据分析
    目录一. 导入Pandas库二. 读取数据三. 查看数据四. 选择数据五. 数据清洗六. 数据分析七. 数据可视化八. 导出数据九. 实战案例总结在数据分析领域,Python的Pan...
    99+
    2023-05-18
    Python Pandas数据分析 Pandas数据分析 Python Pandas
  • python如何使用cProfile针对回测进行性能分析
    这篇文章主要讲解了“python如何使用cProfile针对回测进行性能分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python如何使用cProfile针对回测进行性能分析”吧!安装不...
    99+
    2023-06-02
  • Python利用CNN实现对时序数据进行分类
    目录一、数据集介绍二、数据预处理2.1 获取原始数据2.2 获取原始标签2.3 数据分割2.4 整合数据和标签2.5 保存三、数据训练3.1 读取数据并进行处理3.2 构建数据结构3...
    99+
    2023-02-22
    Python CNN时序数据分类 Python CNN数据分类 Python CNN
  • 使用Python编程语言进行实践的示例分析
    这篇文章将为大家详细讲解有关使用Python编程语言进行实践的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。其实Python真的挺有意思的,用Python用做过不少有趣好玩的事儿,这...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作