使用此 Python 工具分析您的 Web 服务器日志文件

此 Python 模块可以收集多种格式的网站使用日志,并输出结构良好的数据以供分析。
76 位读者喜欢这篇文章。
Person standing in front of a giant computer screen with numbers, data

Opensource.com

是否想知道您网站的访问者数量?或者哪些页面、文章或下载最受欢迎?如果您是自己托管博客或网站,无论您使用 Apache、Nginx 还是 Microsoft IIS(是的,确实如此),lars 都能为您提供帮助。

Lars 是一个用于 Python 的 Web 服务器日志工具包。这意味着您可以使用 Python 来回顾性地(或实时地)使用简单的代码来解析日志文件,并使用这些数据做任何您想做的事情——将其存储在数据库中,将其保存为 CSV 文件,或者立即使用更多 Python 来分析它。

Lars 是 Dave Jones 编写的另一个隐藏的瑰宝。我第一次看到 Dave 在当地的 Python 用户组展示 lars。几年后,我们开始在 piwheels 项目中使用它,以读取 Apache 日志并将行插入到我们的 Postgres 数据库中。当 Raspberry Pi 用户从 piwheels.org 下载 Python 包时,我们会实时记录文件名、时间戳、系统架构(Arm 版本)、发行版名称/版本、Python 版本等等。 由于它是一个关系数据库,我们可以将这些结果连接到其他表上,以获取有关文件的更多上下文信息。

您可以使用以下命令安装 lars:

$ pip install lars

在某些系统上,正确的路线是 [ sudo ] pip3 install lars

要开始使用,请找到单个 Web 访问日志并复制它。 您需要将日志文件下载到您的计算机上才能使用它。 在我的示例中,我使用的是 Apache 日志,但通过一些小的(且显而易见的)更改,您可以使用 Nginx 或 IIS。 在典型的 Web 服务器上,您会在 /var/log/apache2/ 中找到 Apache 日志,然后通常是 access.logssl_access.log(对于 HTTPS)或 gzip 压缩的轮换日志文件,如 access-20200101.gzssl_access-20200101.gz

首先,日志条目是什么样的?

81.174.152.222 - - [30/Jun/2020:23:38:03 +0000] "GET / HTTP/1.1" 200 6763 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0"

这是一个请求,显示了请求来源的 IP 地址、时间戳、请求的文件路径(在本例中为 /,即主页)、HTTP 状态代码、用户代理(Ubuntu 上的 Firefox)等等。

您的日志文件将充满这样的条目,不仅是每个页面的点击,还有每个文件和资源——每个 CSS 样式表、JavaScript 文件和图像、每个 404、每个重定向、每个机器人抓取。 要从您的日志中获取任何有意义的数据,您需要解析、过滤和排序这些条目。 这就是 lars 的用途。 此示例将打开单个日志文件并打印每一行的内容

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            print(row)

这将为每个日志条目显示这样的结果

Row(remote_host=IPv4Address('81.174.152.222'), ident=None, remote_user=None, time=DateTime(2020, 6, 30, 23, 38, 3), request=Request(method='GET', url=Url(scheme='', netloc='', path_str='/', params='', query_str='', fragment=''), protocol='HTTP/1.1'), status=200, size=6763)

它解析了日志条目并将数据放入结构化的格式中。 该条目已成为一个 namedtuple,其属性与条目数据相关,因此,例如,您可以使用 row.status 访问状态代码,使用 row.request.url.path_str 访问路径

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            print(f'hit {row.request.url.path_str} with status code {row.status}')

如果您只想显示 404,您可以这样做

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            if row.status == 404:
                print(row.request.url.path_str)

您可能想要删除这些重复项并打印具有 404 的唯一页面数量

s = set()
with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            if row.status == 404:
                s.add(row.request.url.path_str)
print(len(s))

Dave 和我一直在扩展 piwheels 的记录器以包括网页点击、软件包搜索等等,这多亏了 lars,轻而易举。 它不会告诉我们任何关于我们用户的信息——我们仍然需要进行数据分析,但它已经采用了一种笨拙的文件格式,并以一种我们可以使用的方式将其放入我们的数据库中。

查看 lars 的文档,了解如何读取 Apache、Nginx 和 IIS 日志,并了解您还可以使用它做什么。 再次感谢 Dave 的另一个很棒的工具!


这最初出现在 Ben Nuttall 的 Tooling Blog 上,并经许可重新发布。

接下来阅读什么
标签
User profile image.
Ben 是 BBC News Labs 的软件工程师,也是 Raspberry Pi 的前社区经理。 他喜欢 Linux、Python 和所有开源的东西! 在 Twitter 上关注 Ben @ben_nuttall。

评论已关闭。

Creative Commons License本作品已根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© 2025 open-source.net.cn. All rights reserved.