web-dev-qa-db-ja.com

s3ログを解析する方法は?

ドキュメント に従ってAWS S3ログを解析しようとしましたが、いくつかの問題が発生しました。具体的には、正規表現を壊す新しいまれなログ行に遭遇し続けます。これが発生するたびに、これらの行を考慮して正規表現を変更しますが、これを完全に正しくしたいと思います。

課題は、基本的に、ユーザーエージェントフィールドに引用符を含む任意の文字を含めることができることです(それらはエスケープされていません!)。私は最近、たとえば次のレコードに遭遇しました。

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" -

私のパーサーは、この宝石で窒息する前に、430万を超えるログ行を正常に解析しました。

過去には、正規表現の_<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" -

私のパーサー正規表現(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
Collin

今のところ私はこれに落ち着きました。

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
Collin