游龙战神|Python 工具分析你的 Web 服务器日志文件 | Linux 中国,使用这个


?来源:linux.cn?作者:BenNuttall?译者:geekpi?
(本文字数:3262 , 阅读时长大约:4分钟)
是否想知道有多少访问者访问过你的网站?或哪个页面、文章或下载最受欢迎?如果你是自托管的博客或网站 , 那么无论你使用的是Apache、Nginx还是MicrosoftIIS(是的 , 没错) , lars都可以为你提供帮助 。
Lars是Python写的Web服务器日志工具包 。 这意味着你可以使用Python通过简单的代码来回溯(或实时)解析日志 , 并对数据做任何你想做的事:将它存储在数据库中、另存为CSV文件 , 或者立即使用Python进行更多分析 。
Lars是DaveJones写的另一个隐藏的宝石 。 我最初是在本地Python用户组中看到Dave演示lars 。 几年后 , 我们开始在piwheels项目中使用它来读取Apache日志并将行插入到我们的Postgres数据库中 。 当树莓派用户从piwheels.org下载Python包时 , 我们会记录文件名、时间戳、系统架构(Arm版本)、发行版名称/版本 , Python版本等 。 由于它是一个关系数据库 , 因此我们可以将这些结果加入其他表中以获得有关文件的更多上下文信息 。
你可以使用以下方法安装lars:
$pipinstalllars在某些系统上 , 正确的方式是sudopip3installlars 。
【游龙战神|Python 工具分析你的 Web 服务器日志文件 | Linux 中国,使用这个】首先 , 找到一个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"2006763"-""Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:77.0)Gecko/20100101Firefox/77.0"这是一个显示了请求源IP地址、时间戳、请求文件路径(在本例中是主页/)、HTTP状态代码 , 用户代理(Ubuntu上的Firefox)等的请求 。
你的日志文件将充满这样的条目 , 不仅是每个打开的页面 , 还包括返回的每个文件和资源:每个CSS样式表、JavaScript文件和图像 , 每个404请求、每个重定向、每个爬虫 。 要从日志中获取有意义的数据 , 你需要对条目进行解析、过滤和排序 。 这就是Lars的用处 。 本示例将打开一个日志文件并打印每一行的内容:
withopen('ssl_access.log')asf:withApacheSource(f)assource:forrowinsource: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访问路径:
withopen('ssl_access.log')asf:withApacheSource(f)assource:forrowinsource:print(f'hit{row.request.url.path_str}withstatuscode{row.status}')如果你只想显示404请求 , 可以执行以下操作:
withopen('ssl_access.log')asf:withApacheSource(f)assource:forrowinsource:ifrow.status==404:print(row.request.url.path_str)你可能要对这些数据去重 , 并打印独立的404页面数量:


推荐阅读