python中使用RE解析Syslog数据

python中使用RE解析Syslog数据,python,regex,python-2.7,Python,Regex,Python 2.7,我正在从防火墙中转储系统日志数据,并希望匹配到我家特定IP的连接。我正在使用下面的代码。下面的代码可以收集所有数据,但我的IF语句从不匹配。我尝试过不使用unicode u'192.168.1.1',如果我只打印提取的IP,它会显示出来-请参阅下面的输出。使用Python2.7 #!/usr/bin/env python ## Tiny Syslog Server in Python. ## ## This is a tiny syslog server that is able to re

我正在从防火墙中转储系统日志数据,并希望匹配到我家特定IP的连接。我正在使用下面的代码。下面的代码可以收集所有数据,但我的IF语句从不匹配。我尝试过不使用unicode u'192.168.1.1',如果我只打印提取的IP,它会显示出来-请参阅下面的输出。使用Python2.7

 #!/usr/bin/env python

## Tiny Syslog Server in Python.
##
## This is a tiny syslog server that is able to receive UDP based syslog
## entries on a specified port and save them to a file.
## That's it... it does nothing else...
## There are a few configuration parameters.

LOG_FILE = 'youlogfile2.log'
HOST, PORT = "192.168.1.2", 514

#
# NO USER SERVICEABLE PARTS BELOW HERE...
#

import logging
import SocketServer
import re
server = u'192.168.1.254'

logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='', filename=LOG_FILE, filemode='a')

class SyslogUDPHandler(SocketServer.BaseRequestHandler):

    def handle(self):

        data = bytes.decode(self.request[0].strip())
        socket = self.request[1]
        ipDST = re.compile(r'dst=([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)')
        ipDSTExtracted = ipDST.findall(data)
        #print (ipDSTExtracted)
        if ipDSTExtracted == server:
            print (ipDSTExtracted)

        #print( "%s : " % self.client_address[0], str(data))
        logging.info(str(data))

if __name__ == "__main__":
    try:
        server = SocketServer.UDPServer((HOST,PORT), SyslogUDPHandler)
        server.serve_forever(poll_interval=0.5)
    except (IOError, SystemExit):
        raise
    except KeyboardInterrupt:
        print ("Crtl+C Pressed. Shutting down.") 
}

我在这个输出中找到了很多匹配项,但我不确定是否是括号

[u'8.8.8.8']
[u'8.8.8.8']
[u'192.168.1.254']
[u'8.8.8.8']
[u'8.8.8.8']
[u'8.8.8.8']
[u'192.168.1.254']
[u'8.8.8.8']
[u'192.168.1.209']
[u'8.8.8.8']
[u'192.168.1.26']
[u'8.8.8.8']
[u'8.8.8.8']

我在idle中进行了测试,以查看字符串版本和unicode版本是否相互匹配,但在该设置中似乎不起作用。

findall
返回一个列表。如果将列表(findall的
findall
结果)与字符串(我假设这是
mediasite
变量的内容)进行比较,那么比较结果当然总是错误的

您可能希望通过
findall
将变量与返回的每个元素进行比较。比如:

for ip in ipDST.findall(data)
    if ip == mediasite:
        print (ipDSTExtracted)

您使用的是Python2还是Python3?方括号表示您的输出是一个列表;这永远不会匹配一个字符串;您可能希望改用
ipDSTExtracted[0]
(因为
findall(…)
返回一个列表)。但是,看看您的代码,您将其与未定义的
mediasite
进行比较,因此我不明白您首先要对比的是什么。我确实弄乱了变量,它只是服务器而不是mediasite-但是使用ipDSTExtracted[0]和if ipDSTExtracted[0]==服务器:没有u,它匹配了1次,然后它给出了一个索引超出范围的错误,并继续这样做。这似乎对我不起作用,它从来没有匹配任何项目。因为你没有向我们展示什么
mediasite
实际包含或提供任何样本输入数据,所以很难验证。但是如果
ipDST.findall(data)
返回了一些东西,您应该能够了解循环的其余部分发生了什么。如果它没有返回任何内容,则表示正则表达式有问题。没有mediasite这是一个意外事件,我为您编辑了代码。在ipDST中对ip使用此代码。findall(数据):print ip我得到的输出是良好的192.168.1.115 8.8.8.8.8.8.8.8