【Syslog】用Python搭建一个Syslog服务器

avatar
作者
猴君
阅读量:1

目录

一.背景

二.作用

三.源代码

1.主程序

syslogtool.py

2.小工具

full.py

cpu_data.py

EICAR.COM

3.运行效果

四.使用说明

五.linux上用yum装rsyslog各种问题


一.背景

        最近测试的实习工作中,需要在本机搭一个Syslog服务器来接收控制中心(第三方平台)的日志,涉及到这方面知识盲区了,嗨嗨嗨。网上查阅资料,参考性最好的是这个使用python接收和发送syslog | 码农家园,此外还在centos 8的虚拟机上尝试用yum装了个rsyslog,过程中遇到了不少问题哈哈,好在都一一解决了。

  • 环境:Python3.6.8,Win7
  • 用到的库:datetime,argparse,logging,socketserver,pysyslogclient,psutil

二.作用

  • 可同时用于syslogsever和syslogclient的脚本
  • 请用于系统日志接收测试和传输测试
  • 作为系统日志服务器运行时,收到的系统日志将显示在屏幕上,并同时保存在syslog.log文件中

三.源代码

        服务器端的处理原作者参考的参考如下

1.主程序

syslogtool.py

from datetime import datetime, timezone, timedelta import argparse import logging import socketserver import pysyslogclient #pip install pysyslogclient  #命令行参数 PARSER = argparse.ArgumentParser() PARSER.add_argument("-mode", "--mode", default="CLI", help="action mode:CLI(default) or SERVER") PARSER.add_argument("-i", "--ip", default="127.0.0.1", help="IP or hostname(default localhost)") PARSER.add_argument("-p", "--port", default="514", help="port number(default 514)") PARSER.add_argument("-pr", "--protocol", default="UDP", help="TCP or UDP(default)") PARSER.add_argument("-c", "--count", default="1", help="send count(default 1)") PARSER.add_argument("-m", "--message", default="syslog message!!", help="syslog message")  class SyslogUDPHandler(socketserver.BaseRequestHandler):     """     SyslogUDPHandler     """     LOG_FILE = 'syslog.log'     logging.basicConfig(level=logging.INFO, format='%(message)s',                         datefmt='', filename=LOG_FILE, filemode='a')      def handle(self):         data = bytes.decode(self.request[0].strip())          datalist = str(data).split(" ")         datalist[1] = applytimezonejst(datalist[1])         message = " ".join(datalist)          socket = self.request[1]         print(f"{self.client_address[0]}: {message}")         logging.info(message)          #接受一个名为utcdate的参数。 def applytimezonejst(utcdate):     #使用datetime.strptime方法将输入的utcdate按照给定的格式解析为一个datetime对象,并将其赋值给_dt。     _dt = datetime.strptime(utcdate, "%Y-%m-%d")     #对刚刚创建的_dt对象进行处理,首先使用replace方法将时区信息设置为UTC时间     _dt2 = _dt.replace(tzinfo=timezone.utc).astimezone(timezone(timedelta(hours=8))).strftime("%Y/%m/%d %Z %z")     #返回转换后的日期时间字符串_dt2。     return _dt2   def syslogserver(host, port):     """     syslogserver     """     try:         server = socketserver.UDPServer((host, int(port)), SyslogUDPHandler)         print(f"start syslog server ({host}:{port})")         server.serve_forever(poll_interval=0.5)      except KeyboardInterrupt:         print("Crtl+C Pressed. Shutting down.")  def syslogclient(host, port, prot, count, message):     """     syslogclient     """      client = pysyslogclient.SyslogClientRFC5424(host, port, proto=prot)      for i in range(int(count)):         client.log(message)         print(f"sendcount:{str(i+1)}")  def main():     """     main     """     optargs = PARSER.parse_args()     mode = optargs.mode     host = optargs.ip     port = optargs.port     prot = optargs.protocol     count = optargs.count     message = optargs.message      if mode == "CLI":         syslogclient(host, port, prot, count, message)     else:         syslogserver(host, port)  if __name__ == '__main__':     main() 

2.小工具

full.py

import threading, multiprocessing   def loop():     x = 0     while True:         x = x ^ 1   for i in range(multiprocessing.cpu_count()):     t = threading.Thread(target=loop)   t.start() 

cpu_data.py

import psutil  # 查看CPU信息 cpu_info = psutil.cpu_percent(interval=1, percpu=True) print("CPU使用率:", cpu_info)  # 查看内存信息 mem_info = psutil.virtual_memory() print("内存总量:", mem_info.total) print("内存使用量:", mem_info.used) print("内存空闲量:", mem_info.available) 

EICAR.COM

新建txt文件,然后把下面内容放进去,文件名改成EICAR.COM,文件类型保存为所有文件,ps:用来检测杀毒软件是否有效的一个小方法,不是真的病毒哦~

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

3.运行效果

        在命令行进入到文件相应目录然后执行syslogtools.py,生成的.log文件效果如图,由于平台还在测试阶段,所以有内容就行,具体是什么不用太在意

四.使用说明

由于demo过程中遇到了些小问题,在此写了个说明附上~

1.供测试使用full.py是让cpu大致跑到50%

2.日志的程序在log-syslogtool.py

        2.1 生成的日志在syslogtool.py程序的同级目录下syslog.log

        2.2 记得修改成本地IPv4地址(在命令行cmd用ipconfig查看),端口号自定义,一般用514

        2.3 记得下载需要的库 pip install pysyslogclient还有pip install psutil等等

3.disk-cpu_data.exe是查看cpu和内存的使用情况,代码简单,打包试验了一下

4.两种模式

        4.1 启动服务器

python syslogtool.py --mode SERVER -i <IP地址> -p <端口号>

        4.2 客户端模式

python syslogtool.py -i <IP地址> -pr <UDP or TCP> -p <端口号> -m <syslog 消息> -c <传输计数>

         4.3 帮助

python syslogtool.py -h usage: syslogtool.py [-h] [-mode MODE] [-i IP] [-p PORT] [-pr PROTOCOL]                      [-c COUNT] [-m MESSAGE]  optional arguments:   -h, --help            show this help message and exit   -mode MODE, --mode MODE                         action mode:CLI(default) or SERVER   -i IP, --ip IP        IP or hostname(default localhost)   -p PORT, --port PORT  port number(default 514)   -pr PROTOCOL, --protocol PROTOCOL                         TCP or UDP(default)   -c COUNT, --count COUNT                         send count(default 1)   -m MESSAGE, --message MESSAGE                         syslog message

5.手打的朋友注意缩进,为了方便在虚拟机上只装了Python的IDEL和pip,然后空格和tab出现了问题检查不出来,要ctrl+c/v上一行再加tab才ok

五.linux上用yum装rsyslog各种问题

  • centos 8 停止维护,用yum或者dnf安装包的时候发现会报错:
    Error: Failed to download metadata for repo 'AppStream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

    根本原因:CentOS Linux 8 官方宣布于2021.12.31开始停止维护,延期到2022.1.31执行完毕。老的镜像将移到vault.centos.org。所以,以上报错是由于CentOS 8 EOS 将CentOS 8 Mirror 站点转换为Vault 并且找不到Mirror 站点而出现的问题。

  • 解决方法:更换镜源

  • 推荐阿里云的,这篇文章过程讲的很清楚CentOS 8 安装国内、本地YUM源_centos8国内安装源-CSDN博客

Error: GPG check FAILED

清缓存,再来一遍

最后日志是在一个message文件里,注意是文件!文件!文件!重要的事情说三遍这不是个文件夹,用cd 是不行滴,tail进去就可以看啦

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!