是否想知道您网站的访问者数量?或者哪些页面、文章或下载最受欢迎?如果您是自己托管博客或网站,无论您使用 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.log
、ssl_access.log
(对于 HTTPS)或 gzip 压缩的轮换日志文件,如 access-20200101.gz
或 ssl_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 上,并经许可重新发布。
评论已关闭。