首页 > 解决方案 > 读取 Nginx 日志文件并获取 IP

问题描述

我正在制作一个程序,我需要读取一个包含 IP 的 Nginx 日志文件。该文件如下所示:

127.0.0.1 - - [17/Nov/2020:19:19:55 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
127.0.0.1 - - [17/Nov/2020:19:19:50 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
127.0.0.1 - - [17/Nov/2020:19:19:45 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"

正如我所说,我只需要第一部分,即 IP,并将其保存到一个新的 .txt 文件中。目前我有以下代码可以阅读它,但我不能只获得 IP:

with open('/var/log/nginx/access.log', 'r') as f:
    ip_list = f.readlines()

此代码返回此列表:

['127.0.0.1 - - [17/Nov/2020:19:19:55 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"\n', '\n', 
'127.0.0.1 - - [17/Nov/2020:19:19:50 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"\n', '\n', 
'127.0.0.1 - - [17/Nov/2020:19:19:45 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"\n', '\n']

现在我只需要获取 IP 并用它们创建一个新文件。

标签: pythonpython-3.xlistnginx

解决方案


您可以拆分字符串行--并捕获第一个元素以获取 IP,最后仅将每行上的那些 IP 写入新的日志文件。

with open('/var/log/nginx/access.log', 'r') as f:
    log_line = f.readlines()

ip_list = [ line.split('- -')[0].strip() for line in log_line]
print(ip_list)
with open('/var/log/nginx/access_ips.log', 'w') as f:
    f.write('\n'.join(ip_list))

注意,您可以使用正则表达式模式匹配来仅获取 IP 或任何其他方式,因为它可以通过多种方式完成。


推荐阅读