您的位置:首页 > 运维架构 > Apache

关于apache的日志配置和模板格式分析

2016-01-07 19:35 691 查看
apache上跑的日志一直没有去管。基本就是一个文件走天下,好处在于不需要再去其它地方找了,找一个文件就好了

。问题在于日志越来越大,打开查看就要好几十分钟了,要具体的查询某一个时间点的日志再去分析——这基本上属于不可能的工作。So,这个工作到了必须要处理一下的时候了。

其实这个事情已经开始几天了,但年纪大了学东西有点慢,又不愿意搞个半懂不懂。所以可能会有点慢。分上下两部分吧。

这一部分主要讲配置和模板的格式分析。

一、最简单的apache日志设置。

直接在虚拟主机设置里添加

ErrorLog "/路径/error_log"

CustomLog "/路径/access_log" common

即可针对每个虚拟主机设置单独的日志文件。

不过问题是,这还是仅仅是把单个虚拟主机的日志从总体日志里分离出来,要具体管理还是不可能。

二、对日志进行分割管理

apache提供了日志管理程序rotatelogs,主要用来把日志文件分割管理。



这个命令提供了两种分割的方法,

第一种是按时间,以秒为基准算的,86400就是一天。

第二种是以文件大小,给出的例子是5M。

正常情况下一般是采用日期对日志进行管理的。所以在虚拟主机配置中加入以下的设置

ErrorLog "|  /apache安装路径/bin/rotatelogs  /路径/%Y_%m_%d_error_log 86400 480"

CustomLog "|  /apache安装路径/bin/rotatelogs  /路径/%Y_%m_%d_access_log 86400 480" common

%Y,%m,%d这三个都很明显,分别表示的是年月日。

在86400后面的480其实是UTC的时间偏移量,毕竟我们的时区是东八区和日界线UTC时间差了八小时,如果没有写480,会按最原始的时候进行分割,这和我们要记录的时间不一样。这里的时间单位是分钟,8小时,即480分钟。

common,其实是access_log的模板名称。这个在http.conf文件里有记录。规定了access_log文件的记录格式。如:



OK,保存好配置之后,重启apche,对相对应的虚拟主机访问一下,日志文件就会产生了。

三、关于模板的解读和access_log记录的对照分析。

下面分析一下access_log和error_log两个日志的内容,毕竟日志写了如果看不懂基本等于无用功。

先access_log,没别的,这个文件有一个默认模块,识图认字比较容易。

common模板(好吧。再出现一次)



如上所示。我们对上面八个选项逐个分析,分别是:

%h,%l,%u,%t,%r(不是\"%r\",那两个\其实就是转译符,两个"是当字符出现的),%>s,%b

%h  主要显示的是访问的域名/IP,一般来说是IP地址

%l   远程登录的名字,不过是由identd提供,所以一般都是空

%u  登录用户,这个有可能不是空,但我没见过

%t   这个是访问时间

%r  这个是访问的方法+资源+协议,有点难懂吧?等下看过日志就明白了,不过看过之后更加不明白了。

%>s  内部重定向的请求,如果没加>是原来的请求,加了>是后来的请求。比如200是确认的正常返回码,404是页面无法访问

%b  已经发送的字节数(这个最好懂)

OK。进入日志具体分析

115.236.140.12  -  -  [07/Jan/2016:11:21:41 +0800]  "GET  /   HTTP/1.1"  200  1933

以此条日志信息为例,得出的日志分析是  

115.236.140.12  在   北京时间(+0800)  2016年1月07日,上午11:21:41 访问了站点的 / 协议为HTTP/1.1 请求状态码是200,已发送字节 1933。

这里除了登录用户名(第三项)为空之外(第二个远程登录名一般是由identd提供的邮箱,常年为空,当不存在了),其它的都好理解,相对比较麻烦的就是  访问的方法+资源+协议这项,即 "GET  /   HTTP/1.1"  。其实协议也好办,最难理解的是第一个方法,这整个一项也是日志最核心的东西——也就是对方到底做了什么。

分析如下的日志



第一行,其实是我对站点进行访问——自然也就访问了站点的 / ,所以这里用方法是GET,因为是访问所以发出的字节是 1933

第二行,是我在页面登录,提交了登录信息。这里很奇怪没有登录用户名,但可以看到方法已经变成了POST,访问是资源是/index.php——其实就是在index.php。由于是提交所以发出的字节是0。(之前传出的1933,应该就是index.php)

而登录完成之后的日志如下:



系统后来直接跳转访问的其它页面陆续出来,不过用的也是方法GET。

不过方法GET并不仅仅表示系统对页面的直接访问和加载,其实更直接的是对某个页面的直接访问,这个无论是系统还是其它人为。为什么这么说?因为网络还是很危险的,某位朋友对我的服务器好像采取了摸鱼式的扫描。



用的自然也是GET方法。当然,这些最后返回的全是404,网络世界真可怕。

从这几天的观察,方法值在GET居多,POST时有,还出现CONNECT和HEAD,但是还出现了一个不知道什么鬼的\x16\x03\x03\x03\x0c\x01。

现在POST和GET 方法内容基本清楚,CONNECT,HEAD还有\x16\x03\x03\x03\x0c\x01,以及还未出现的其它方法,估计要查询之后再才能得出答案。

error_log

这个文件的格式是固定的,相对简单一点

错误时间    错误类型   对方地址   具体的错误信息

前面这三个基本上一目了然,最关键的最后后的具体错误信息,一天之内找到了如下的几个

 File does not exist:   这种一般是找不到文件,后面接的一般是服务器内真实的绝对路径。

script 'XXX.php' not found or unable to stat  这种和上面差不多都是找不到文件,但文件脚本本身是apache可以加载识别的

client denied by server configuration  这种错误一般和服务器的配置有关,错误都比较直接可以很快找到问题所在。但要明白的是,如果是配置过而错误,那是配置的问题;如果没有配置还出现错误,那就是被人家扫描了。

还有两个不知道什么意思:

client sent HTTP/1.1 request without hostname 

Invalid URI in request \x16\x03\x01\x03\x0c\x01

这一节大概到这里吧。大概搞清了日志的分割设置方法和基本的解读。下一节分析一下模板的可选项,自己做一个模板然后是日志的备份。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: