Я пытался проанализировать журналы AWS S3, следуя документации , но у меня возникли некоторые проблемы. В частности, я постоянно сталкиваюсь с новыми, редкими строками журнала, которые нарушают мое регулярное выражение. Каждый раз, когда это происходит, я изменяю свое регулярное выражение, чтобы учесть эти строки, но я Я действительно хотел бы сделать это правильно раз и навсегда.
Проблема в том, что поле пользовательского агента может содержать произвольные символы, включая кавычки, очевидно (они даже не экранируются!). Недавно я наткнулся на следующую запись, например:
8b24a6e5b101a6376ebfd307854b8379da11acdc3efc2a2cbbf305b4a2af8de7 ----- отредактированное имя-ведра ----- [13 ноября 2015 г .: 18: 43: 39 +0000FF0] - 6.376.7AAC REST.GET.OBJECT a.gif "GET / ----- отредактированный-путь ----- 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, как Gecko) Chrome / 46.0.24907.36 Safari / 46.0.2490.76 Safari
Проблема заключается в том, что поле пользовательского агента может содержать произвольные символы, включая, по-видимому, кавычки (они даже не экранируются!). Недавно я наткнулся на следующую запись, например:
8b24a6e5b101a6376ebfd307854b8379da11acdc3efc2a2cbbf305b4a2af8de7 ----- отредактированное имя-ведра ----- [13 ноября 2015 г .: 18: 43: 39 +0000FF0] - 6.376.7AAC REST.GET.OBJECT a.gif "GET / ----- отредактированный-путь ----- 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, как Gecko) Chrome / 46.0.24907.36 Safari / 46.0.2490.76 Safari
Проблема заключается в том, что поле пользовательского агента может содержать произвольные символы, включая, по-видимому, кавычки (они даже не экранируются!). Недавно я наткнулся на следующую запись, например:
8b24a6e5b101a6376ebfd307854b8379da11acdc3efc2a2cbbf305b4a2af8de7 ----- отредактированное имя-ведра ----- [13 ноября 2015 г .: 18: 43: 39 +0000FF0] - 6.376.7AAC REST.GET.OBJECT a.gif "GET / ----- отредактированный-путь ----- 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, как Gecko) Chrome / 46.0.24907.36 Safari / 46.0.2490.76 Safari
Мой синтаксический анализатор успешно проанализировал более 4,3 миллиона строк журнала, прежде чем заглушил этот гем.
В прошлом синтаксический анализатор также подавлял эту запись перед изменением части
в регулярное выражение не должно быть жадным:
8b24a6e5b101a6376ebfd307854b8379da11acdc3efc2a2cbbf305b4a2af8de7 ----- отредактировано-имя-ведра ----- [26 / сен / 2015: 12: 59: 27B5EBCBD1.2482.28C08C08C08C08C08C08C09.28 .OBJECT a.gif "GET / ----- отредактированный-путь ----- 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) как Gecko »-
Регулярное выражение моего синтаксического анализатора (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'$'
)
Я принимаю неправильный подход? Есть ли способы улучшить мое регулярное выражение? Это действительно расстраивает.
На данный момент я остановился на этом.
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'$'
)