解析包含Space的Apache Common Log Format请求URL

时间:2017-04-02 14:17:01

标签: regex apache logging

我正在尝试使用Python中的以下正则表达式解析Apache常见日志格式日志

APACHE_ACCESS_LOG_PATTERN = '^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+)\s*(\S*)" (\d{3}) (\S+)'

我的典型日志格式为

uplherc.upl.com - - [01/Aug/1995:00:00:04 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 401 0

但我的很多网址都包含空格,我如何解析它们:

uplherc.upl.com - - [01/Aug/1995:00:00:04 -0400] "GET /images/ksclogo-medium large  .gif HTTP/1.0" 401 0

目前我正在使用此代码解析

match = re.search(APACHE_ACCESS_LOG_PATTERN, logline)
if match is None:
    print>>output_file, logline
    return
size_field = match.group(9)
if size_field == '-':
    size = long(0)
else:
    size = long(match.group(9))
return (Access(
    ipAddress     = match.group(1),
    clientIdentd = match.group(2),
    userId       = match.group(3),
    dateTime     = parse_apache_time(match.group(4)),
    method        = match.group(5),
    endpoint      = match.group(6),
    protocol      = match.group(7),
    responseCode = int(match.group(8)),
    contentSize  = size
), 1)

谢谢

2 个答案:

答案 0 :(得分:0)

因此,如果Apache没有自动编码空格,请尝试以这种方式修改正则表达式:

APACHE_ACCESS_LOG_PATTERN = '^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (.+?) (\S+)" (\d{3}) (\S+)'

答案 1 :(得分:0)

这是一个对我有用的解决方案,用于获取空白。这是一种非贪婪的解决方案,可将双引号之间的所有内容都包括在内,包括空格。

^(\S+) - - \[([\w:\/]+\s[+\-]\d{4})\] "(.*?)" (\d{3}) (\d+)
                                        ^^^^