今天不废话,直奔主题。
说说怎么用,免得大家伙一头雾水,不知道怎么运行。
下载一个python3.8,这不重要python3都行,然后安装。
将以下文件拷贝成一个.py文件,如:Syslog.py
#!/usr/bin/python3
import os
import socket
import time
DevList = [
[5,'LWCO-N6/7-U41-SW-6800-POC'],
[3,'HZXY-38-A05-SLB-1'],
[3,'HZYX-38-A05-LLB-1'],
[3,'HZLW-N01-5208-LLB-1'],
[3,'HZLW-N01-5208-SLB-1']
]
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('10.213.8.112', 514))
def SyslogToFile():
while True:
data = server.recvfrom(8092)
(LogMsg, host) = data
LogMsg = LogMsg.decode()
print(LogMsg)
LogMsgList_ = LogMsg.split(' ')
LogMsgList = []
for i in LogMsgList_:
if i != '':
LogMsgList.append(i)
for i in DevList:
if LogMsgList[i[0]] == i[1]:
with open(FileName(i[1]),mode='a') as f:
f.write(LogMsg+'\n')
else:continue
def FileName(hostname):
Asctime_ = time.asctime().split(' ')
Asctime = []
for i in Asctime_:
if i != '':
Asctime.append(i)
Day = "-".join([Asctime[4], Asctime[1], Asctime[2]])
Path = r'D:\SyslogData'
if os.path.exists(Path+'/%s'%Day) == False:
NewDir = Path + './%s'%Day
os.mkdir(NewDir)
else:
NewDir = Path + './%s'%Day
hostname = hostname.replace("/","")
filename = NewDir +'./'+ hostname
return filename
SyslogToFile()
管理员身份运行IDLE
File 打开Syslog.py
Run —— Run... Customized
忽略弹出的对话框,直接OK,然后,程序就运行了,就可以接收syslog了。
哟西。
以上,就上syslog服务器的运行。
接下来,请自行创建D:\SyslogData文件夹,不然会报错。
然后怎么发日志呢,以一台H3C交换机为例:
info-center loghost 10.213.8.112
info-center source default loghost level informational
好了,
完成。
程序什么功能?
将每天收到的syslog日志根据主机hostname的不同进行分类存储&#xff0c;大概算了下&#xff0c;每台网络设备每天产生的日志(info级别)<10M&#xff0c;那么我们有100台网络设备&#xff0c;一天产生的日志<1G&#xff0c;那么一年365天所需要的存储空间为&#64;#&#xffe5;%……&*。。。 反正也不多的啦&#xff0c;将这些日志存储在文本文件中&#xff0c;可行。
下面&#xff0c;我们来对程序进行设置&#xff1a;
1、设置网络设备&#xff1a;
DevList &#61; [
[5,&#39;LWCO-N6/7-U41-SW-6800-POC&#39;],
[3,&#39;HZXY-38-A05-SLB-1&#39;],
[3,&#39;HZYX-38-A05-LLB-1&#39;],
[3,&#39;HZLW-N01-5208-LLB-1&#39;],
[3,&#39;HZLW-N01-5208-SLB-1&#39;]
]
[5,&#39;LWCO-N6/7-U41-SW-6800-POC&#39;]
其中5表示序列号是&#xff0c;&#39;LWCO-N6/7-U41-SW-6800-POC&#39;表示的是这台主机的hostname&#xff0c;也能够决定保存文件的文件名。
5的由来&#xff0c;来到交换机&#xff0c;我们来dis logb
选取一条syslog信息&#xff0c;贴出来。
%Jul 1 22:31:33:644 2011 LWCO-N6/7-U41-SW-6800-POC SHELL/5/SHELL_LOGOUT: admin logged out from 10.5.0.208.
然后我们来排个序&#xff1a;
0 %Jul
1
2 1
3 22:31:33:644
4 2011
5 LWCO-N6/7-U41-SW-6800-POC
6 SHELL/5/SHELL_LOGOUT:
7 ........
够了&#xff0c;够了
以上看出这里之所以是5&#xff0c;是因为将日志信息按照空格分割排序后&#xff0c;hostname的序号刚好就是5。这样理解简单。
hostname就是hostname&#xff0c;直接从syslog粘上去即可。
主机自己复制粘贴上去就行啦&#xff0c;重复配置就不演示了。
运行一段时间后&#xff0c;观察我们创建的D:\SyslogData文件夹&#xff1a;
下面多了一个以时间命名的文件夹&#xff0c;继续点进去
这些&#xff0c;就是我们不同主机发过来的日志文件&#xff0c;以文本文件形式打开&#xff0c;会发现&#xff0c;日志呢&#xff0c;都在这里了。
如果需要修改文件保存路径&#xff0c;请修改这一段中的D:\SyslogData&#xff0c;但在文件保存之前&#xff0c;修改的目录一定要是存在的。
好了&#xff0c;今天就到这里。
后续&#xff1a;
12月份了&#xff0c;发现程序并没有自动创建文件夹及文件&#xff0c;并将日志写到新文件中。
发现负载均衡日志信息中12月比11月多了一个空字符&#xff0c;导致列表匹配异常&#xff0c;无法正常使用&#xff0c;&#xff0c;当然并不是所有设备都这样&#xff0c;为此对代码进行了优化。
11月收到日志格式如下&#xff1a;
<133>Nov 19 00:00:44 HZLW-N01-5208-SLB-1 NOTICE AlteonOS : real service vm-lw-gaea-dealer-manage...r-t01, IP 10.213.7.36:8080 operational, affected virt 10.210.49.90
12月收到日志格式(列表)如下&#xff1a;
[&#39;<189>Dec&#39;, ‘’&#xff0c; &#39;5&#39;, &#39;11:10:54&#39;, &#39;HZLW-N02-5208-SLB-2&#39;, &#39;NOTICE&#39;, &#39;AlteonOS&#39;, &#39;:&#39;, &#39;admin(admin)&#39;, &#39;login&#39;, &#39;from&#39;, &#39;host&#39;, &#39;10.194.86.154&#39;, &#39;via&#39;, &#39;WBM&#39;]
优化方法&#xff1a;将列表中的&#39;&#39;删除&#xff0c;重新组合。
Asctime_ &#61; time.asctime().split(&#39; &#39;)
Asctime &#61; []
for i in Asctime_:
if i !&#61; &#39;&#39;:
Asctime.append(i)
LogMsgList_ &#61; LogMsg.split(&#39; &#39;)
LogMsgList &#61; []
for i in LogMsgList_:
if i !&#61; &#39;&#39;:
LogMsgList.append(i)