Как разбирать журналы s3?

Я пытался проанализировать журналы 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'$'
)

Я принимаю неправильный подход? Есть ли способы улучшить мое регулярное выражение? Это действительно расстраивает.

2
задан 24 November 2015 в 16:45
1 ответ

На данный момент я остановился на этом.

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'$'
)
1
ответ дан 3 December 2019 в 12:43

Теги

Похожие вопросы