我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Python怎么对Syslog信息进行分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Python怎么对Syslog信息进行分析

本篇文章给大家分享的是有关使用Python怎么对Syslog信息进行分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

实验目的:

  • 对设备Syslong信息进行分析记录,并写入sqlite数据库中;后续读取数据库的信息,对Syslog的严重级别分布、来源进行分析进行分析。

  • 同时监控OSPF的状态信息,状态一旦改变,进行告警。

实验结果:

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

使用Python怎么对Syslog信息进行分析

使用Python怎么对Syslog信息进行分析

监控OSPF状态信息:

使用Python怎么对Syslog信息进行分析

实验环境:

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

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

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

ospf配置略。

 python脚本:

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

import socketserverimport refrom dateutil import parserimport osimport 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, class="lazy" data-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 sqlite3from matplotlib import pyplot as pltfrom 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信息进行分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Python怎么对Syslog信息进行分析

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

下载Word文档

猜你喜欢

使用Python怎么对Syslog信息进行分析

本篇文章给大家分享的是有关使用Python怎么对Syslog信息进行分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实验目的:对设备Syslong信息进行分析记录,并写入sq
2023-06-14

使用 python 进行微信好友分析

使用 python 进行微信好友分析1. 使用到的库① wxpy:初始化微信机器人② openpyxl:保存微信好友数据为Excel表格③ pyecharts:生成可视化的地图④ wordcloud、matplotlib、jieba:生成词
2023-01-31

怎么使用Python进行数据分析

使用Python进行数据分析可以通过以下几个步骤:1. 安装Python和相关库:首先需要安装Python解释器,推荐使用Anaconda发行版,因为它已经包含了很多常用的数据分析库,如NumPy、Pandas和Matplotlib等。可以
2023-08-23

使用python怎么对文本进行拆分

使用python怎么对文本进行拆分?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、l
2023-06-14

怎么使用Python进行同期群分析

本篇内容主要讲解“怎么使用Python进行同期群分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python进行同期群分析”吧!同期群分析同期群分析概念同期群(Cohort)的字面意思
2023-07-05

怎么使用Mongodb进行分析

要使用Mongodb进行分析,需要按照以下步骤进行操作:1. 安装Mongodb数据库:首先,需要安装Mongodb数据库,并将其设置为运行状态。可以从Mongodb官方网站下载适合您操作系统的安装程序,并按照官方文档中的说明进行安装。2.
2023-08-23

利用shiro怎么对登录信息进行保存

这篇文章将为大家详细讲解有关利用shiro怎么对登录信息进行保存,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Shiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时
2023-05-31

利用python对微信自动进行消息推送

from wxpy import * #该库主要是用来模拟与对接微信操作的import requestsfrom datetime import datetimeimport timeimport schedulefrom apsch
2023-01-30

怎么用Python进行数据分析

这篇文章主要讲解了“怎么用Python进行数据分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python进行数据分析”吧!评论情感倾向先调用百度AI来分析微博和b站的评论情感倾向。
2023-06-01

使用Flutter怎么对JSON进行解析

本篇文章为大家展示了使用Flutter怎么对JSON进行解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Dart实体类格式class CategoryMo { String name; int c
2023-06-14

怎么利用python进行数值分析

小编给大家分享一下怎么利用python进行数值分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、准备噪声是在拟合过程中常用的干扰手段,常用的噪声:1.统一分布 U(a,b)f ( x ) = { 1 i f a ≤ x
2023-06-15

怎么用Python进行帕累托分析

这篇文章主要介绍“怎么用Python进行帕累托分析”,在日常操作中,相信很多人在怎么用Python进行帕累托分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python进行帕累托分析”的疑惑有所帮助!
2023-06-15

使用Python怎么对Excel进行处理

本篇文章为大家展示了使用Python怎么对Excel进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本
2023-06-07

怎么利用Python进行客户分群分析

这篇文章主要讲解了“怎么利用Python进行客户分群分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么利用Python进行客户分群分析”吧!导入数据和python库import pand
2023-07-05

python如何使用cProfile针对回测进行性能分析

这篇文章主要讲解了“python如何使用cProfile针对回测进行性能分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python如何使用cProfile针对回测进行性能分析”吧!安装不
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录