概述
可同时用于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 |