Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么。的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源。我们将在这篇文章中着重讲解 Apache HTTP web server 生成的 Apache access 日志。

这次,我们会通过另类的途径来分析 Apache access 日志,我们使用的工具是 asql。asql 是一个开源的工具,它能够允许使用者使用 SQL 语句来查询日志,从而通过更加友好的格式展现相同的信息。

Apache 日志背景知识

Apache 有两种日志:

  • Access log:存放在路径 /var/log/apache2/access.log (Debian) 或者 /var/log/httpd/access_log (Red Hat)。Access Log 记录所有 Apache web server 执行的请求。
  • Error log:存放在路径 /var/log/apache2/error.log (Debian) 或者 /var/log/httpd/error_log (Red Hat)。Error log 记录所有 Apache web server 报告的错误以及错误的情况。Error 情况包括(不限于)403(Forbidden,通常在请求被拒绝访问时被报告),404(Not found,在请求资源不存在时被报告)。

虽然管理员可以通过配置 Apache 的配置文件来自定义 Apache access log 的详细程度,不过在这篇文章中,我们会使用默认的配置,如下:

因此一个典型的 Apache 日志条目就是下面这个样子:

但是 Apache error log 又是怎么样的呢?因为 error log 条目主要记录 access log 中特殊的请求(你可以自定义),所以你可以通过 access log 来获得关于错误情况的更多信息(example 5 有更多细节)。

此外要提前说明的, access log 是系统级别的日志文件。要分析虚拟主机的日志文件,你需要检查它们相应的配置文件(例如: 在 /etc/apache2/sites-available/[virtual host name] 里(Debian))。

在 Linux 上安装 asql

asql 由 Perl 编写,而且需求以下两个 Perl 模块:SQLite 的 DBI 驱动以及 GNU readline。

在 Debian, Ubuntu 以及其衍生发行版上安装 asql

使用基于 Debian 发行版上的 aptitude,asql 以及其依赖会被自动安装。

# aptitude install asql

在 Fedora,CentOS,RHEL 上安装 asql

在 CentOS 或 RHEL 上,你需要启用 EPEL repository,然后运行以下代码。在 Fedora 中,直接运行以下代码:

# sudo yum install perl-DBD-SQLite perl-Term-Readline-Gnu
# wget http://www.steve.org.uk/Software/asql/asql-1.7.tar.gz
# tar xvfvz asql-1.7.tar.gz
# cd asql
# make install

asql 是如何工作的?

从上面代码中的依赖中你就可以看出来,asql 转换未结构化的明文 Apache 日志为结构化的 SQLite 数据库信息。生成的 SQLite 数据库可以接受正常的 SQL 查询语句。数据库可以通过当前以及之前的日志文件生成,其中也包括压缩转换过的日志文件,类似 access.log.X.gz 或者 access_log.old。

首先,从命令行启动 asql:

# asql

你会进入 asql 内置的 shell 交互界面。

输入 help 列表可执行的命令:

首先在 asql 中加载所有的 access 日志:

asql > load 

比如在 Debian 下:

asql > load /var/log/apache2/access.*

在 CentOS/RHEL 下:

asql > load /var/log/httpd/access_log*

当 asql 完成对 access 日志的加载后,我们就可以开始数据库查询了。注意一下,加载后生成的数据库是 “temporary” (临时)的,意思就是数据库会在你退出 asql 的时候被清除。如果你想要保留数据库,你必须先将其保存为一个文件。我们会在后面介绍如何这么做(参考 example 3 和 4)。

生成的数据库有一个名为 logs 的表。输入下面的命令列出 logs 表中提供的域:

一个名为 .asql 的隐藏文件,保存于用户的 home 目录下,记录用户在 asql shell 中输入的命令历史。因此你可以使用方向键浏览命令历史,按下 ENTER 来重复执行之前的命令。

asql 上的示例 SQL 查询

下面是几个使用 asql 针对 Apache 日志文件运行 SQL 查询的示例:

Example 1:列出在 2014 年 10 月中请求的来源 / 时间以及 HTTP 状态码。

view source print?
SELECT source, date, status FROM logs WHERE date >= '2014-10-01T00:00:00' ORDER BY source;

Example 2:从小到大显示单个客户端处理的请求大小(bytes)。

view source print?
SELECT source, SUM(size), AS NUMBER FROM logs GROUP BY source ORDER BY Number DESC;

Example 3:在当前目录中保存数据库为 [filename]。

save [filename]

这样做可以避免使用 load 命令对日志的语法分析所占用的处理时间。

Example 4:在重新进入 asql 后载入数据库。

restore [filename]

Example 5:返回 access 日志中记录的 error 情况。在这个例子中,我们将显示所有返回 HTTP 状态码为 403(access forbidden)的请求。

view source print?
SELECT source, date, status, request FROM logs WHERE status='403' ORDER BY date

这个例子想要表现的是:虽然 asql 只分析 access 日志,我们还是可以通过使用请求的状态域来显示有 error 情况的请求。

小结:

我们体验了 asql 如何帮助我们分析 Apache 日志文件,并将结果通过友好的格式输出。虽然你也可以通过使用命令行的工具(例如 cat 与 grep,uniq,sort,wc 等等之间的管道)来实现类似功能,与此比较起来 asql 展示了它如同瑞士军刀一般的强大功能,使我们在自己的需求下能够通过标准 SQL 查询语句来过滤日志。

转自:http://www.php100.com/html/it/mobile/2014/1216/8065.html

转载于:https://www.cnblogs.com/jackspider/p/4167189.html

如何在 Linux 上用 SQL 语句来查询 Apache 日志相关推荐

  1. kjb文件 解析_在Linux上使用lnav监控和分析Apache日志文件工具

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要讲解如何在Linux上使用lnav监控和分析A ...

  2. linux下sql查询的使用,sql-server – 如何在Linux上查看SQL Server中的执行计划

    微软发布了一款名为 SQL Operations studio的新工具,它类似于SSMS,但可以在Windows,Linux,Macos上使用. 下面是它的样子截图 使用sqlopsstudio查看实 ...

  3. c#如何在linux上运行程序,在Linux上运行C#

    众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x.ME.NT.2000.XP和Win CE之类的操作系统.但是,现在却有了一个叫做Mono的项目,它的目 ...

  4. 如何在linux上直接运行python程序

    如何在linux上直接运行python程序 一.前言 二.具体步骤 一.前言 个人主页: ζ小菜鸡 大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习如何在linux上直接运行python程序. 如果文章 ...

  5. Linux怎么给命令创建别名,如何在Linux上创建别名和Shell函数 | MOS86

    使用别名和Bash Shell函数创建自己的Linux命令. 驯服重复性任务,截断冗长的进程,并使用您经常使用且难以记住的选项配置标准命令. 别名和Shell脚本是Linux和类似Unix的操作系统中 ...

  6. linux上查看网络限制,如何在Linux上限制网络带宽

    您是否曾经与多个设备共享网络带宽?如果您曾经处于一个应用程序占用了所有流量的位置,那么您是系统管理员还是Linux用户,您将需要发现如何控制应用程序的上载和下载速度,以确保您的带宽并不完全被单个应用程 ...

  7. linux下安装sbt_如何在Linux上安装SBT

    linux下安装sbt 介绍 (Introduction) Hi! I am Sanjula, and in this guide I hope to teach you how to install ...

  8. 如何在Linux上找到包含特定文本的所有文件?

    我正在尝试找到一种方法来扫描整个Linux系统,查找包含特定文本字符串的所有文件. 只是为了澄清,我在文件中寻找文本,而不是文件名. 当我查找如何做到这一点时,我遇到了两次这个解决方案: find / ...

  9. docker删除所有容器_如何在Linux上创建,列出和删除Docker容器

    本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 我的官方群点击此处 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个 ...

最新文章

  1. 宝藏索引图出炉!一图在手,文章全拥有!
  2. Eclipse下配置主题颜色
  3. [jQuery]无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案
  4. python read函数_Python read()函数:读入指定长度的文本
  5. Android系统init进程启动及init.rc全解析
  6. 无季节效应的非平稳序列分析(一)
  7. activiti 生命周期_一文让你读懂什么是Activiti工作流
  8. 作为程序员我是如何对事物进行分析的
  9. 求完全二叉树结点个数(leetcode 222)
  10. 接口测试 python+PyCharm 环境搭建
  11. C++ typedef 用法详解
  12. idea继承后重新方法快捷键_idea 查看类继承关系的快捷键
  13. 压缩JPG图片大小而且不失真
  14. 在2147483647的边缘疯狂试探
  15. excel图片技巧:如何为报表配上节日祝福动画
  16. 三线表制作(word)
  17. 力扣(LeetCode)个人主页draw()方法怎么画出好看图案? // 使用函数 draw 绘制图形,反斜杠 “\“ 请使用 “\\“ 转义
  18. 数据分析之Quick bi
  19. 激活windows转到电脑设置的水印怎么消失
  20. win10远程访问服务器(Centos 7服务器)

热门文章

  1. 自己整合优化的一个Android框架
  2. 浅入浅出JS中的eval及json
  3. centos7安装Samba服务
  4. Delphi 2009 泛型容器单元(Generics.Collections)[1]: TListT
  5. Cloudify — Plugins
  6. Service Mesh — APIGW vs ServiceMesh
  7. Cinder LVM backend cinder-volume service down
  8. 互联网协议 — TLS — 安全四要素
  9. NR 5G 用户平面协议
  10. NR 5G 密钥与安全详解