拆分服务器访问日志字符串

时间:2014-06-20 19:18:39

标签: python

我已经尝试了一段时间来拆分此服务器访问日志字符串,但无济于事。字符串以这种格式出现

10.223.157.186 - - [15 / Jul / 2009:15:50:35 -0700]" GET /assets/css/reset.css HTTP / 1.1" 200 1014

  • %h是客户端的IP地址
  • %l是客户的身份,或" - "如果它不可用
  • %u是客户的用户名,或" - "如果它不可用
  • %t是服务器处理完请求的时间。格式为[日/月/年:小时:分钟:第二区]
  • %r是来自客户端的请求行(双引号)。它包含方法,路径,查询字符串,协议或请求。
  • %> s是服务器发送回客户端的状态代码。您将看到主要是状态代码200(确定 - 请求已成功),304(未修改)和404(未找到)。
  • %b是返回给客户端的对象的大小,以字节为单位。它将是" - "如果状态代码为304

我使用过`str.split()和str(" \ t")但无济于事。谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

您需要使用regular expression

例如,如果你有这个:

import re
line = '10.223.157.186 - - [15/Jul/2009:15:50:35 -0700] "GET /assets/css/reset.css HTTP/1.1" 200 1014'
regexString = r'(?P<IP>[0-9.]+) (?P<ID>[\w-]+) (?P<user>[\w-]+) (?P<time>\[.*\]) (?P<request>".*") (?P<status>\d+) (?P<size>\d+)'  
regex = re.compile(regexString)
match = regex.match(line)
if match != None:
    ip = match.group('IP')
    id = match.group('ID')
    # etc.

如果你想从时间中提取每件事,即日,月,年等,那么你可以在match.group上运行另一个正则表达式(&#39; time&#39;)或者你可以更多在regexString中明确指出如何解析它 例如,您可以拥有:\[(?P<day>\d+)/(?P<month>[A-Za-z]+)/(?P<year>\d+):(?P<hour>\d+):(?P<minute>\d+):(?P<second>\d+) -(?P<zone>\d+)\]

这会让你:
regexString = r'(?P<IP>[0-9.]+) (?P<ID>[\w-]+) (?P<user>[\w-]+) \[(?P<day>\d+)/(?P<month>[A-Za-z]+)/(?P<year>\d+):(?P<hour>\d+):(?P<minute>\d+):(?P<second>\d+) -(?P<zone>\d+)\] (?P<request>".*") (?P<status>\d+) (?P<size>\d+)'