如何parsings3日志?

我一直试图parsing文档中的 AWS S3日志,但是我遇到了一些问题。 具体来说,我不断遇到新的,罕见的日志行,打破了我的正则expression式。 每次发生这种情况时,我修改我的正则expression式来解释这些行,但是我真的希望一劳永逸地解决这个问题。

挑战在于,用户代理字段显然允许包含任意字符(包括引号)(甚至不会被转义!)。 我最近遇到以下logging,例如:

8b24a6e5b101a6376ebfd307854b8379da11acdc3efc2a2cbbf305b4a2af8de7 -----redacted-bucket-name----- [13/Nov/2015:18:43:39 +0000] 86.3.176.75 - 6AA66FF0D0ACB8BF REST.GET.OBJECT a.gif "GET /-----redacted-path----- HTTP/1.1" 200 - 26 26 18 17 "http://www.waldorfford.com/new/Ford/2015-Ford-Transit+Connect-7f06c8800a0a006400f609b1db0568a3.htm" "Mozilla/5.0 (Linux; Android 5.0.1; Alba 7" Tablet Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Safari/537.36" -

我的parsing器成功parsing了超过四百三十万个日志行,然后在这个gem上窒息。

在过去,parsing器也扼杀了这个logging,在将正则expression式的<referrer>部分改为非贪婪之前:

8b24a6e5b101a6376ebfd307854b8379da11acdc3efc2a2cbbf305b4a2af8de7 -----redacted-bucket-name----- [26/Sep/2015:12:59:27 +0000] 67.248.97.42 - C5EBC1D929EBBD53 REST.GET.OBJECT a.gif "GET /-----redacted-path----- HTTP/1.1" 200 - 26 26 46 46 "http://www.fiatusaofalbany.com/new-inventory/?year=&make=FIAT&SBmake=FIAT&pid=119682883&adid=292527846&spid=0&sid=905577&channel=display&buytype=",$B$1,"&TR=",$B$2,"&cid=0" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" -

我的parsing器正则expression式(Python):

 log_regex = re.compile( r'^' r'(?P<owner>\S+) ' r'(?P<bucket>\S+) ' r'\[(?P<timestamp>[^\]]+)\] ' r'(?P<ip_address>\S+) ' r'(?P<requester>\S+) ' r'(?P<request_id>\S+) ' r'(?P<operation>\S+) ' r'(?P<key>\S+) ' r'("(?P<request_uri>[^"]+)"|-) ' r'(?P<status>\S+) ' r'(?P<error_code>\S+) ' r'(?P<response_bytes>\S+) ' r'(?P<object_size>\S+) ' r'(?P<request_ms>\S+) ' r'(?P<processing_ms>\S+) ' r'("(?P<referrer>.+?)" |- )' r'("(?P<user_agent>[^"]+)"|-) ' r'(?P<version_id>\S+)' r'$' ) 

我采取了错误的做法? 有没有办法来改进我的正则expression式? 这真是令人沮丧。

现在我已经解决了这个问题。

 log_regex = re.compile( r'^' r'(?P<owner>\S+) ' r'(?P<bucket>\S+) ' r'\[(?P<timestamp>[^\]]+)\] ' r'(?P<ip_address>\S+) ' r'(?P<requester>\S+) ' r'(?P<request_id>\S+) ' r'(?P<operation>\S+) ' r'(?P<key>\S+) ' r'("(?P<request_uri>[^"]+)"|-) ' r'(?P<status>\S+) ' r'(?P<error_code>\S+) ' r'(?P<response_bytes>\S+) ' r'(?P<object_size>\S+) ' r'(?P<request_ms>\S+) ' r'(?P<processing_ms>\S+) ' r'("(?P<referrer>.+?)"|-) ' r'("(?P<user_agent>.+?)"|-) ' r'(?P<version_id>\S+)' r'$' )