使用python将syslog输出处理为csv

nx7onnlm  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(323)

我需要帮助从我的siem获取日志事件,并将它们处理成csv文件,该文件可以接收到hadoop中进行进一步处理。以下是siem的样本和预期结果。我在用python工作,但我没有我需要的经验。

Apr 22 11:52:28 siem <159>Apr 22 11:55:26 10.1.1.10 LEEF:1.0|Websense|Security|7.7.3|transaction:permitted|sev=1       cat=9   usrName=LDAP://10.10.10.10 OU=Standard Users,OU=Users,OU=Frostbyte Falls,OU=Frostbyte - QSD,OU=CDG,OU=North America,DC=Global,DC=bullwinke,DC=com/Mr. Moose  src=10.1.10.10        srcPort=62133   srcBytes=233    dstBytes=39469  dst=165.254.42.233   dstPort=80  proxyStatus-code=200    serverStatus-code=304   duration=0 method=GET       disposition=1048  contentType=application/zip     reason=-        policy=role-8**US Frostbyte        role=8  userAgent=IPM url=http://acroipm.adobe.com/10/rdr/ENU/win/nooem/none/message.zip

配置单元列定义:日期时间日志源用户srcip srcport dstip dstport方法负载
csv格式:

Apr 22, 11:55:26, 10.1.1.10, Mr. Moose, 10.1.10.10, 62133, 165.254.42.233, 80, GET, url=http://acroipm.adobe.com/10/rdr/ENU/win/nooem/none/message.zip

思想?
当做

inn6fuwd

inn6fuwd1#

首先:您应该选择一个更好的序列化输出,因为在这种情况下,字符串处理非常危险,也没有您希望的那么有效。
不过,我为您的问题做了一些regex捕获,这些都是列表,但是我猜,从这里,您可以决定如何访问,以及您希望访问什么样的字符串数据,并且您可以一直这样做 ','.join(<list here>) 在列表末尾用逗号连接项目。。
但正如我上面提到的,我不建议您使用此解决方案,您应该以不同于源代码的方式捕获此数据。。

import re

string = 'Apr 22 11:52:28 siem <159>Apr 22 11:55:26 10.1.1.10 LEEF:1.0|Websense|Security|7.7.3|transaction:permitted|sev=1       cat=9   usrName=LDAP://10.10.10.10 OU=Standard Users,OU=Users,OU=Frostbyte Falls,OU=Frostbyte - QSD,OU=CDG,OU=North America,DC=Global,DC=bullwinke,DC=com/Mr. Moose  src=10.1.10.10        srcPort=62133   srcBytes=233    dstBytes=39469  dst=165.254.42.233   dstPort=80  proxyStatus-code=200    serverStatus-code=304   duration=0 method=GET       disposition=1048  contentType=application/zip     reason=-        policy=role-8**US Frostbyte        role=8  userAgent=IPM url=http://acroipm.adobe.com/10/rdr/ENU/win/nooem/none/message.zip'

dates = re.findall(r'(\w+)\s(\d+)\s(\d+:\d+:\d+)\s', string)
ip = re.findall(r'\d+\.\d+\.\d+\.\d+', string)
url = re.findall(r'url=.*(?!\s)', string)
dstport = re.findall(r'dstPort=(\d+)', string)
srcport = re.findall(r'srcPort=(\d+)', string)
method = re.findall(r'method=(\w+)\s', string)
user = re.findall(r'DC=com/(.*)\ssrc=', string)

print dates, ip, url, dstport, srcport, method, user
htzpubme

htzpubme2#

我同意peter varo的观点,如果可能的话,你可能想使用更好的格式。但是如果你必须分析其他东西产生的数据… 好吧,你必须解析它。
如果您想用regex来完成,我强烈建议您要么匹配整行,要么逐行解析,而不是收集所有日期,然后收集所有时间,等等。例如:

import csv
import re

r = re.compile(r'''(?x)
                >(?P<date>\w\w\w\s\d\d) \s
                (?P<time>\d\d:\d\d:\d\d) \s
                (?P<logsource>\d+\.\d+\.\d+\.\d+) \s
                .*?
                DC=com/(?P<user>.*?) \s+
                src=(?P<srcIP>\d+\.\d+\.\d+\.\d+) \s+
                srcPort=(?P<srcPort>\d+) \s+ .*?
                dst=(?P<dstIP>\d+\.\d+\.\d+\.\d+) \s+
                dstPort=(?P<dstPort>\d+) \s+ .*?
                method=(?P<method>\w+) \s+ .*?
                url=(?P<url>.*(?!\s))
                ''')

with open(logpath) as logfile, open(csvpath, 'w') as csvfile:
    csv.writer(csvfile).writerows(r.findall(logfile))

但是,您的日志格式似乎是一种定义良好的格式,一种格式塞进另一种格式,另一种格式塞进另一种格式。换句话说,您有一个典型的syslog格式 TIMESTAMP SOURCE <PID>MESSAGE ,然后 MESSAGE 中间有一个ldap url,以此类推。其中至少有一些是众所周知的正则表达式(或其他解析器),那么为什么要从头开始编写它们呢?

相关问题