使用python接收和发送syslog


概述

syslogtool1.gif

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

执行环境

使用python 3.6.9确认操作

1
2
> python -V
Python 3.6.9 :: Anaconda, Inc.

使用conda构建环境时转到本文
python环境构建Miniconda3动手操作多个版本共存

添加pysyslogclient

1
> pip install pysyslogclient

源代码

我在服务器端的处理中参考了以下文章。
https://qiita.com/ranmatsu/items/f76fcc607869aeab35e3
https://gist.github.com/marcelom/4218010

syslogtool.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""
python3.6
"""
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)

def applytimezonejst(utcdate):
    """
    syslogパケット内のUTCの日付をJSTに変換して返す
    """
    _dt = datetime.strptime(utcdate, "%Y-%m-%dT%H:%M:%S.%fZ")
    _dt2 = _dt.replace(tzinfo=timezone.utc)\
            .astimezone(timezone(timedelta(hours=9)))\
            .strftime("%Y/%m/%d %H:%M:%S %Z %z")

    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()

如何使用

  • 服务器模式

以下命令启动服务器,并在指定的地址和端口进行侦听。

1
python syslogtool.py --mode SERVER -i <IPアドレス> -p <ポート番号>
  • 客户端模式
1
python syslogtool.py -i <IPアドレス> -pr <UDP or TCP> -p <ポート番号> -m <syslogメッセージ> -c <送信回数>
  • 帮忙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

exe转换

执行以下操作时,dist文件夹中将生成syslogtool.exe。
如果分发该exe,则可以在任何地方运行它

1
2
> pip install pyinstaller
> pyinstaller syslogtool.py --onedir --onefile --clean

image.png