推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > OneTodo > apache日志分析总结(转)

apache日志分析总结(转)

OneTodo 2018-08-03

web服务器日志配置和分析详解

从某种程度上将”日志就是金钱”,因为通过日志能够分析出一个网站具有高流量,则广告商愿意为其支付费用。对于所有的公司或ICP来说,除了要保证网站稳定正常的运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,提高各个网站的服务能力和服务水平是必不可少的。而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。

一、web日志分析原理

web服务器日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对日志进行统计、分析和综合,就能有效地掌握服务器的运行状况、发现和排除错误原因、了解客户访问分布等,更好地加强系统的维护和管理。Web服务模式主要有三个步骤:

  

 服务响应,Web服务器接收到请求后,按照用户要求运行相应的功能,并将信息返回给用户。如果出现错误,将返回错误代码。

  

 追加日志,服务器将对用户访问过程中的相关信息以追加的方式保存到日志文件中。如图1 。

 

 

 图1 Web服务模式主要有三个步骤

二、Apache日志的配置

 

1、日志类型

  

      1.3 版本Apache 的标准中规定了4类日志:

  

  • 错误日志

  

  • 访问日志

  

  • 传输日志

  

  • Cookie日志

  

      其中:传输日志和Cookie日志被Apache 2.0认为已经过时。所以本文仅讨论错误日志和访问日志。同时错误日志和访问日志被Apache 2.0默认设置。

  

      错误日志包含:

  

      获知失效链接

  

      获知 CGI 错误

  

      获知用户认证错误

  

      访问日志包含:

  

  

      浏览者访问的资源:可以得知网站中的哪些部分最受欢迎

  

      浏览者的浏览时间:可以从浏览时间(如工作时间或休闲时间)对网站内容进行调整

  

      浏览者使用的浏览器:可以根据大多数浏览者使用的浏览器对站点进行优化

  

      访问日志分类:

  

      为了便于分析 Apache 的访问日志,Apache 的默认配置文件中,按记录的信息不同(用不同格式昵称说明不同的信息)将访问日志分为4类:

  

  普通日志格式(common log format,CLF)common  大多数日志分析软件都支持这种格式

参考日志格式(referer log format)referrer  记录客户访问站点的用户身份

代理日志格式(agent log format)agent  记录请求的用户代理

综合日志格式(combined log format)combined  结合以上三种日志信息 

      2、配置访问日志命令

  

      CustomLog 命令用来对服务器的请求进行日志记录。格式为:

  

      格式1:CustomLog 访问日志文件名 记录格式说明串|格式昵称

  

      格式2:CustomLog "|管道程序名 访问日志文件名" 记录格式说明串|格式昵称

  

      说明:

  

      访问日志文件名:除非文件位置用”/“开头,否则所制定的文件位置是相对于 ServerRoot 目录的相对路径

  

      格式昵称:使用 LogFormat 命令将一个记录格式说明串赋以一个名称

  

      记录格式说明串:用字符串和格式说明符(以%开头)指定日志记录的内容

  

      管道程序名:管道符”|”后面紧跟着一个程序的路径,这个程序把日志从标准输入设备中读入并处理。

  

      LogFormat 命令用于定义访问日志的记录格式。格式为:

  

      LogFormat "记录格式说明串" 格式昵称

  

      从apache2.conf 中可知,在Apache 中定义了下面的 4 种类型的访问日志:

       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  
  LogFormat "%h %l %u %t \"%r\" %>s %b" common  
  LogFormat "%{Referer}i -> %U" referer  
  LogFormat "%{User-agent}i" agent

 


       由于综合日志格式简单地结合了3种日志信息,所以在配置访问日志时,要么使用一个综合文件进行记录,要么使用分离的多个(1-3)文件记录。通常使用一个综合日志格式文件进行记录,配置为:

CustomLog /var/log/apache2/access.log combined

  若使用3个文件分别进行记录,配置为:

      CustomLog /var/log/apache2/access.log common 
  CustomLog /var/log/apache2/referer.log referer 
  CustomLog /var/log/apache2/agent.log agent

  下面的命令组:

      LogFormat "%h %l %u %t \"%r\" %>s %b" common 
  CustomLog logs/access_log common

  与下面的命令等效:

CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"

  通常我们配置访问日志时,使用先使用 LogFormat 命令定义格式昵称,然后再在 CustomLog 命令中引用昵称的方法。

  在使用 LogFormat 和 CustomLog 命令中为了说明要记录的日志内容,可以使用的常用格式说明符如表-3。

格式说明符

说明

%v

进行服务的服务器的标准名字 ServerName,通常用于虚拟主机的日志记录中。

%h

%l

从identd服务器中获取远程登录名称,基本已废弃。

%u

来自于认证的远程用户。

%t

连接的日期和时间。

%r

HTTP请求的首行信息,典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。经常可能出现的 METHOD 是 GET、POST 和 HEAD;RESOURCE 是指浏览者向服务器请求的文档或 URL;PROTOCOL 通常是HTTP,后面再加上版本号,通常是 HTTP/1.1。

%>s

响应请求的状态代码,一般这项的值是 200,表示服务器已经成功地响应浏览器的请求,一切正常;以 3 开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置;以 4 开头的状态代码表示客户端存在某种错误;以 5 开头的状态代码表示服务器遇到了某个错误。

%b

传送的字节数(不包含HTTP头信息),将日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。

%{Referer}i

指明了该请求是从被哪个网页提交过来的。

%U

请求的URL路径,不包含查询串。

\"%{User-Agent}i\"

此项是客户浏览器提供的浏览器识别信息。

  图2是从一个访问日志文件中截取的几条记录。这里使用winscp远程登录到Solaris 10 服务器的日志文件目录。

 

 

apache日志分析总结(转) 

 图2 apache 访问日志

  

       将其中一列各项信息分离于表-4所示。

 

格式说明符


举例1

%h

远程主机IP

192.168.220.1

%l


-(表示没有取得信息)

%u


-

%t

访问日期,时间和时差

 

14/Oct/2008:19:54:51 +0800

%r

请求 / 版本

"GET / HTTP/1.1"

%>s

服务状态码

404

%b

发送的字节数

1185

%{Referer}i


”-”

%{User-Agent}i



 

  3、配置错误日志

 

  错误日志记录了服务器运行期间遇到的各种错误,以及一些普通的诊断信息,比如服务器何时启动、何时关闭等。

 

  ErrorLog 命令指定了当服务器遇到错误时记录错误日志的文件名。其格式为:

 

  格式1:ErrorLog 错误日志文件名

 

  格式2:ErrorLog "|管道程序名"

 

  格式1直接指定错误日志文件名,除非文件位置用”/“开头,否则 ErrorLog 所制定的文件位置是相对于 ServerRoot 目录的相对路径。

 

  格式2实现管道日志,它指定一个命令来处理错误日志。

 

  Apache 编译时默认的错误日志可以使用如下命令获得:

      $ apache2 -V| grep DEFAULT_ERRORLOG 
  -D DEFAULT_ERRORLOG="logs/error_log"

  LogLevel

 

  LogLevel 用于调整记于错误日志中的信息的详细程度。

等级

应用说明

级别

emerg

出现紧急情况使得该系统不可用,如系统宕机等

1

alert

需要立即引起注意的情况

2

crit

危险情况的警告

3

error

除了emerg、alert、crit的其他错误

4

warn

警告信息

5

notice

需要引起注意的情况,但不如error、warn重要

6

info

值得报告的一般消息

7

debug

由运行于debug模式的程序所产生的消息

8

  图3是从一个访问错误文件中截取的几条记录。这里使用winscp远程登录到Solaris 10 服务器的日志文件目录。

 

 

apache日志分析总结(转) 

  图3 apache 错误日志

 

  从文件内容可以看出,每一行记录了一个错误。格式为:

 

日期和时间 错误等级 错误消息

 

三、定义日志格式參數詳解

定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令。在httpd.conf文件中。

LogFormat指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。CustomLog指令设置日志文件,并指明日志文件所用的格式。

LogFormat指令的功能是定义日志格式并为它指定一个名字。例如,在默认的httpd.conf文件中,我们可以找到下面这行代码:

LogFormat "%h %l %u %t \"%r\" %>s %b" common

该指令创建了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。

Apache文档已经给出了所有可用于格式串的变量及其含义:

----------------------------------------------------------------------

%...B: 已发送的字节数,不包含HTTP头

%...b: CLF格式的已发送字节数量,不包含HTTP头。

例如当没有发送数据时,写入‘-’而不是0。

%...{FOOBAR}e: 环境变量FOOBAR的内容

%...f: 文件名字

%...h: 远程主机

%...H 请求的协议

%...{Foobar}i: Foobar的内容,发送给服务器的请求的标头行。

%...l: 远程登录名字(来自identd,如提供的话)

%...m 请求的方法

%...{Foobar}n: 来自另外一个模块的注解“Foobar”的内容

%...{Foobar}o: Foobar的内容,应答的标头行

%...p: 服务器响应请求时使用的端口

%...P: 响应请求的子进程ID。

%...q 查询字符串(如果存在查询字符串,则包含“?”后面的

部分;否则,它是一个空字符串。)

%...r: 请求的第一行

%...s: 状态。对于进行内部重定向的请求,这是指*原来*请求

的状态。如果用%...>s,则是指后来的请求。

%...t: 以公共日志时间格式表示的时间(或称为标准英文格式)

%...{format}t: 以指定格式format表示的时间

%...T: 为响应请求而耗费的时间,以秒计

%...u: 远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)

%...U: 用户所请求的URL路径

%...v: 响应请求的服务器的ServerName

%...V: 依照UseCanonicalName设置得到的服务器名字

------------------------------------------------------------------

在所有上面列出的变量中,“...”表示一个可选的条件。如果没有指定条件,则变量的值将以“-”取代。

有时候我们只想在日志中记录某些特定的、已定义的信息,这时就要用到“...”。如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请 求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。例如,如果我们想要记录的是网站的所有无效链接,那么可以使用:

----------------------------------------------------

LogFormat %404{Referer}i BrokenLinks

---------------------------------------------------

反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可:

LogFormat %!200U SomethingWrong

 

四、Apache日志的滚动

 

 

1、为什么使用日志滚动

 

由于Apache 进程本身不负责对日志文件进行滚动,因此必须使用其他程序配置日志滚动。所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费。同时也加快了管理员查看日志所用的时间,因为打开小文件的速度比打开大文件的速度要快。

 

2、使用命令使用空的日志文件 

 

要使系统重新使用空的日志文件,可以执行如下的命令:

      cd /opt/coolstack/apache2/log 
  mv access_log access_log.old 
  mv error_log error_log.old 
  /opt/coolstack/apache2/bin/apachectl graceful 
  sleep 800 
  gzip access_log.old error_log.old

  上面的指令片断是进行日志滚动的基础,用户可以自行编制脚本让cron 执行。下面介绍两种常用的日志滚动配置方法。

 

3、使用 rotatelogs 实现日志滚动

 

  Apache 自带的 rotatelogs 程序可以实现日志滚动。rotatelogs是一个配合 Apache 管道日志功能使用的简单程序。为了使用 rotatelogs 程序,需要在 Apache 配置文件中使用管道日志的配置。

 

  rotatelogs 命令的格式如图4:

 apache日志分析总结(转)

 

 

  rotatelogs 命令的格式

 

  其中:

 

  -l:使用本地时间代替GMT时间作为时间基准。

 

  logfile:日志文件名。有两种格式表示新的日志开始使用的时间。

 

  如果 logfile中包含”%”,则它会被视为用于strftime()的格式字符串;常用的有:

 

  %Y:4位数的年份

 

  %m:2位数的月份

 

  %d:2位数的一个月中的日期数

 

  %H:2位数的小时数(24小时制)

 

  %M:2位数的分钟数

 

  %S:2位数的秒数

 

  %U:2位数的一年中的星期数(星期天为一周的第一天)

 

  %W:2位数的一年中的星期数(星期一为一周的第一天)

 

  %w:1位数的星期几(星期天为一周的第一天)

 

  否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀,这里 nnnnnnnnnn 是开始记录日志的格林威治时间距离 1970年1月1日 的秒数。

 

  rotationtime:日志文件滚动的以秒为单位的间隔时间。

 

  offset:相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。

 

  filesizeM:指定以 filesizeM 文件大小滚动,而不是按照时间来滚动日志。

 

  使用举例:

 

  1:每过一天滚动日志 ,修改apache配置文件如下:

TransferLog "| /opt/coolstack/apache2/bin/rotatelogs / opt/coolstack/apache2/log /access.log 86400" combined

  其中 86400(秒)是日志滚动的时间。86400 秒就是 1 天。滚动以后的文件名为/ opt/coolstack/apache2/log /access.log /access_log.nnnnnnnnnn,这里 nnnnnnnnnn 是开始记录日志的格林威治时间距离 1970年1月1日 的秒数。当日志滚动一次后将生成一个新的日志文件,后缀为前一个日志文件的后缀值加 86400。

 

  2:在日志文件大小增长到指定字节时滚动日志 ,修改apache配置文件如下:

TransferLog "|/opt/coolstack/apache2/bin/rotatelogs / opt/coolstack/apache2/log/apache2/access.log 20M" combined

  此配置会在日志文件大小增长到 20M 字节时滚动该日志。

 

  3:使用logrotate 实现日志滚动

 

  logrotate 是Unix、Linux系统实现日志滚动的通用程序。Linux下可以直接使用,Solaris 10 下要进行安装配置。

      #wegt ftp://ftp.sunfreeware.com/pub/freeware/intel/10/logrotate-3.7.1-sol10-x86-local.gz 
  #gunzip ftp://ftp.sunfreeware.com/pub/freeware/intel/10/logrotate-3.7.1-sol10-x86-local.gz 
  #pkgadd –d logrotate-3.7.1-sol10-x86-local

  图5是logrotate安装配置完成界面

 

 

apache日志分析总结(转) 

  logrotate安装配置完成界面

 

  可以把配置文件/usr/local/doc/logrotate/examples/ logrotate-default复制为配置文件/etc/logrotate.conf

 

  可以把配置文件/usr/local/doc/logrotate/examples/ logrotate.cron复制到文件目录/etc/cron.d/

 

  下面看看配置文件如图6。

 

 

 

  配置文件

 

  logrotate的配置文件中可以看到,除了wtmp以外,需要滚动的日志的配置都保存在/etc/logroate.d目录下。因此只需要在该目录下创建一个名为apache的配置文件,来指示logrotate如何轮循Web服务器的日志文件即可。下面是一个示例:

      / opt/coolstack/apache2/log { 
  rotate 2 
  daily 
  missingok 
  sharedscripts 
  postrotate 
  /usr/bin/killall -HUP httpd 2> /dev/null || true 
  endscript 
  }

  这里“rotate 2”表示轮循时只包括两个备份文件,也就是只有access_log、access_log.1和access_log.2三个日志备份文件。这种方法的优点是不需要其它第三方工具就可以实现日志轮循。但是对于重负载的服务器和使用负载均衡技术的Web服务器来说,这种方法不是很实用。因为它是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。

 

  4:使用使用 cronolog 实现日志滚动

 

  cronolog (http://cronolog.org/ )是基于 rotatelogs 的一个第三方工具软件。cronolog 可以非常整齐的将日志按天轮循存储,即每个日志文件存储的是 00:00:00 到 23:59:59 时间之内的所有日志。

 

  1.准备gcc for solaris10 编译器,这里用的版本:gcc-3.3.2-sol10-intel-local.gz

 

  2.下载解压缩文件

      #wegt ftp://ftp.sunfreeware.com/pub/freeware/intel/10/gcc-3.3.2-sol10-intel-local.gz 
  #gizip –d gcc-3.3.2-sol10-intel-local.gz

  3.安装 

#pkgadd -d gcc-3.3.2-sol10-intel-local

  接下来的安装,是一个交互安装过程

 

  默认安装路径/usr/local/bin

 

  4.设置PATH变量

      # PATH=$PATH:/usr/local/bin 
  #PATH=$PATH:/usr/ccs/bin 
  # export PATH

  5. 准备coronolog,版本:cronolog-1.6.2.tar.gz

 

  6.下载安装:

      #wegt http://cronolog.org/download/cronolog-1.6.2.tar.gz 
  # tar zxvf cronolog-1.6.2.tar.gz 
  # cd cronolog-1.6.2 
  # ./configure 
  # make 
  # make install

 

 

  cronolog安装配置完成界面

 

  可以看到默认是安装在/usr/local/sbin/下 。下面是一个使用 cronolog 的例子:

CustomLog "|/usr/local/sbin/cronolog / opt/coolstack/apache2/log /access.log.%Y-%m-%d" combined

  他将按日志依次生成日志文件,如:

      access.log.2008-09-18 
  access.log.2008-09-19 
  access.log.2008-09-20 
  access.log.2008-09-21 
  access.log.2008-09-22

若要压缩旧的日志文件或清除无用的日志文件,可以使用 find 等命令 配合系统 crond 来实现。

 

 

五、Apache 状态码詳解:

基本上可以分为五类:

1xx 为消息类,该类状态代码用于表示服务器临时回应。

100 Continue 表示初始的请求已经被服务器接受,浏览器应当继续发送请求的其余部分

101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议。

2xx 表示浏览器端请求被处理成功。

200 OK 一切正常。

201 Created 服务器已经创建了文档,Location 头给出了它的 URL。

202 Accepted 已经接受请求,但处理尚未完成。

203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。

204 No Content 没有新文档,浏览器应该继续显示原来的文档。这个跟下面的 304 非常相似。

205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。

206 Partial Content 客户发送了一个带有 Range 头的GET请求,服务器完成了它。注意,通过 Range 可以实现断点续传。

3xx 重定向。

300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。 
出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。 
注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user ,有的服务器返回301,有的则返回302。 
严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取。

304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。

307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向。4xx 错误

4xx 客户端错误

400 Bad Request 请求出现语法错误。

401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。

405 Method Not Allowed 请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。

406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容。

407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。

408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。

409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。

411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。

412 Precondition Failed 请求头中指定的一些前提条件失败。

413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头。

414 Request URI Too Long URI太长。

416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。

5xx 服务器错误

500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。 (服务端的程序错误)

501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。

502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。

504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。

505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。

HTTP错误代码详细介绍


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《apache日志分析总结(转)》的版权归原作者「OneTodo」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注OneTodo微信公众号

OneTodo微信公众号:ludong86

OneTodo

手机扫描上方二维码即可关注OneTodo微信公众号

OneTodo最新文章

精品公众号随机推荐