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

目录

一.背景

二.作用

三.源代码

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进去就可以看啦

  • 29
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值