gpt4 book ai didi

python - 解析具有 2 个 ip 地址的 apache 日志

转载 作者:行者123 更新时间:2023-11-28 16:44:52 26 4
gpt4 key购买 nike

我有一个正在尝试解析的 apache 日志文件。我发现了几种不同的方法,包括 apachelog ,两个答案here , 和 this .使用这些方法中的任何一种,我都能够解析日志中的大部分行。但是,有些线路有 2 个 IP 地址:

xxx.xx.xx.xxx, yy.yyy.yy.yyy - - [14/Feb/2013:03:55:21 +0000] "GET /alink HTTP/1.0" 200 90210 "http://www.google.com/search" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Web Preview) Chrome/22.0.1229 Safari/537.4"

所提到的方法都无法正确解析这一行。 (我什至尝试了 apachelog 的 virtualhost 选项)。有什么建议么?我正在使用我提到的后一种方法(但对任何事情都持开放态度),例如:

parts = [
r'(?P<host>\S+)', # host %h
r'\S+', # indent %l (unused)
r'(?P<user>\S+)', # user %u
r'\[(?P<time>.+)\]', # time %t
r'"(?P<request>.+)"', # request "%r"
r'(?P<status>[0-9]+)', # status %>s
r'(?P<size>\S+)', # size %b (careful, can be '-')
r'"(?P<referer>.*)"', # referer "%{Referer}i"
r'"(?P<agent>.*)"', # user agent "%{User-agent}i"
]
pattern = re.compile(r'\s+'.join(parts)+r'\s*\Z')

for line in open(log):
try:
m = pattern.match(line)
if m:
res = m.groupdict()
data.append(res)
if not m:
print line
except:
print line

最佳答案

您可以修改列表中正则表达式的第一部分,以允许以逗号分隔的主机列表。以下适用于您的示例行:

import re
parts = [
r'(?P<host>\S+(,\s*\S+)*)', # comma-separated list of hosts
r'\S+', # indent %l (unused)
r'(?P<user>\S+)', # user %u
r'\[(?P<time>.+)\]', # time %t
r'"(?P<request>.+)"', # request "%r"
r'(?P<status>[0-9]+)', # status %>s
r'(?P<size>\S+)', # size %b (careful, can be '-')
r'"(?P<referer>.*)"', # referer "%{Referer}i"
r'"(?P<agent>.*)"', # user agent "%{User-agent}i"
]
pattern = re.compile(r'\s+'.join(parts)+r'\s*\Z')

test = 'xxx.xx.xx.xxx, yy.yyy.yy.yyy - - [14/Feb/2013:03:55:21 +0000] "GET /alink HTTP/1.0" 200 90210 "http://www.google.com/search" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML,like Gecko; Google Web Preview) Chrome/22.0.1229 Safari/537.4"'
m = pattern.match(test)
res = m.groupdict()

在上述命令之后,res['host']包含xxx.xx.xx.xxx, yy.yyy.yy.yyy。如果您需要单独的主机地址,您可以使用 res['host'].split(',') 获取地址列表。

关于python - 解析具有 2 个 ip 地址的 apache 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14889591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com