当前位置: 首页 > 科技观察

如何在Linux上使用SQL语句查询Apache日志

时间:2023-03-15 14:05:33 科技观察

Linux有一个很了不起的特性。一般情况下,您可以通过日志来分析系统日志,了解您的系统发生了什么或正在发生什么。确实,系统日志是系统管理员在排除系统和应用程序问题时最需要的第一手资源。在本文中,我们将重点关注ApacheHTTPWeb服务器生成的Apache访问日志。本次我们将通过另一种方式来分析Apache访问日志,我们使用的工具是asql。asql是一个开源工具,允许用户使用SQL语句查询日志,从而以更友好的格式呈现相同的信息。Apache日志背景知识Apache有两种类型的日志:访问日志:存放在路径/var/log/apache2/access.log(Debian)或/var/log/httpd/access_log(RedHat)。访问日志记录了ApacheWeb服务器执行的所有请求。错误日志:保存在/var/log/apache2/error.log(Debian)或/var/log/httpd/error_log(RedHat)路径下。错误日志记录了Apache网络服务器报告的所有错误以及错误的情况。错误情况包括(不限于)403(Forbidden,通常在请求被拒绝访问时上报)、404(Notfound,在请求的资源不存在时上报)。虽然管理员可以通过配置Apache配置文件来自定义Apache访问日志的详细程度,但在本文中,我们将使用默认配置如下:远程IP-请求时间-请求类型-响应代码-请求的URL-远程浏览器信息(可能包括操作系统信息),因此典型的Apache日志条目如下所示:192.168.0.101--[22/Aug/2014:12:03:36-0300]"GET/icons/unknown.gifHTTP/1.1"200519"http://192.168.0.10/test/projects/read_json/""Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:30.0)Gecko/20100101Firefox/30.0"但是Apache的错误日志呢?由于错误日志条目主要记录访问日志中的特殊请求(您可以自定义),因此您可以通过访问日志获取有关错误情况的更多信息(示例5有更多详细信息)。另外需要提前说明一下,accesslog是系统级别的日志文件。要分析虚拟主机的日志文件,需要查看它们对应的配置文件(例如:在/etc/apache2/sites-available/[虚拟主机名](Debian))。在Linux上安装asqlasql是用Perl编写的,需要以下两个Perl模块:SQLite的DBI驱动程序和GNUreadline。在基于Debian的发行版上使用aptitude在Debian、Ubuntu和衍生版上安装asql,asql及其依赖项会自动安装。#aptitudeinstallasqlonFedora,CentOS,RHEL要在CentOS或RHEL上安装asql,您需要启用EPEL存储库,然后运行以下代码。在Fedora中,直接运行以下代码:#sudoyuminstallperl-DBD-SQLiteperl-Term-Readline-Gnu#wgethttp://www.steve.org.uk/Software/asql/asql-1.7.ta??r.gz#tarxvfvzasql-1.7.ta??r.gz#cdasql#makeinstallasql它是如何工作的?从上面代码中的依赖可以看出,asql将非结构化的明文Apache日志转化为结构化的SQLite数据库信息。生成的SQLite数据库可以接受普通的SQL查询语句。数据库可以从当前和以前的日志文件生成,包括压缩转换后的日志文件,如access.log.X.gz或access_log.old。首先,从命令行启动asql:#asql您将进入asql内置的shell界面。输入helplist可执行命令:首先加载asql中的所有访问日志:asql>load如Debian下:asql>load/var/log/apache2/access.*在CentOS/RHEL下:asql>load/var/log/httpd/access_log*当asql加载完访问日志后,我们就可以开始数据库查询了。注意加载后生成的数据库是“临时的”,也就是说当你退出asql时数据库会被清空。如果要保留数据库,必须先将其保存为文件。稍后我们将展示如何执行此操作(参见示例3和4)。生成的数据库有一个名为logs的表。输入以下命令列出日志表中提供的字段:一个名为.asql的隐藏文件,保存在用户的主目录中,记录了用户在asqlshell中输入的命令历史记录。所以你可以使用箭头键浏览命令历史,然后按回车键重复上一条命令。asql上的示例SQL查询以下是使用asql对Apache日志文件运行SQL查询的几个示例:示例1:列出2014年10月请求的源/时间和HTTP状态代码。SELECTsource,date,statusFROMlogsWHEREdate>='2014-10-01T00:00:00'按来源排序;示例2:显示单个客户端处理的请求大小(字节)从小到大。SELECTsource,SUM(size),ASNUMBERFROMlogsGROUPBYsourceORDERBYNumberDESC;示例3:将数据库保存为当前目录中的[filename]。save[filename]这避免了使用load命令解析日志所花费的处理时间。例4:重新进入asql后加载数据库。restore[filename]Example5:返回访问日志中记录的错误。在此示例中,我们将显示所有返回HTTP状态代码403(禁止访问)的请求。SELECTsource,date,status,requestFROMlogsWHEREstatus='403'ORDERBYdate这个例子想说明虽然asql只分析访问日志,但是我们仍然可以通过request的status字段来显示有错误的请求。总结:我们体验了asql如何帮助我们分析Apache日志文件并以友好的格式输出结果。虽然也可以使用命令行工具(如cat和grep之间的管道、uniq、sort、wc等)来实现类似的功能,但与此相比,asql就显示出了瑞士军刀般的强大功能,使得我们可以根据自己的需要,通过标准的SQL查询语句过滤日志。希望本教程能对您有所帮助。评论文章、分享文章、提问请不要拘束。通过:http://xmodulo.com/sql-queries-apache-log-files-linux.html作者:GabrielCánepa译者:ThomazL校对:wxy