http://limimgjie.iteye.com/blog/1180881
通过标准日志的状态,监控服务的整体稳定性,
配置服务日志的标准格式:
nginx日志:
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" $request_time';
记录的形式如下:
- 112.15.238.212 - - [25/Sep/2011:04:01:11 +0800] "GET /UserRecommend.php HTTP/1.1" 200 870 "http://moviebox.baofeng.net/newbox1.0/index.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)" 320
日志格式说明:
$remote_addr 远程请求使用的IP地址
$remote_user 远端登录名
$time_local 时间,用普通日志时间格式(标准英语格式)
$request 请求的第一行
$status 状态。
$body_bytes_sent 请求返回的字节数,包括请求头的数据
$http_referer 请求头Referer的内容
$http_user_agent 请求头User-Agent的内容
$request_time 处理完请求所花时间,以秒为单位
apache日志:
- LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T " combined
- CustomLog log/access_log combined
记录的形式如下:
- 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
日志格式说明:
%h 请求使用的IP地址
%l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
%u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
%t 时间,用普通日志时间格式(标准英语格式)
%r 请求的第一行
%s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,---%>s则指的是最后请求的状态。
%b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示'-'而不是0。
\"%{Referer}i\" 发送到服务器的请求头Referer的内容。
\"%{User-Agent}i\" 发送到服务器的请求头User-Agent的内容。
%T 处理完请求所花时间,以秒为单位。
%I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
%O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
日志定时切割的脚本:
/sh/log_apache.sh
- # apache log backup
- #!/bin/bash
- # 获取昨天的日期
- logfilename=`date -d yesterday +%Y_%m_%d`
- today=`date +%Y.%m.%d`
- # 设置日志文件原始路径
- logfilepath=/opt/modules/apache2/logs/
- # 设置日志备份文件路径
- backupfilepath=/opt/data/logs/apache/
- echo "get access log:"
- # 打包压缩访问日志文件
- cd ${logfilepath}
- tar zcvf ${backupfilepath}access/${logfilename}.tar.gz access_${logfilename}.log
- rm -rf access_${logfilename}.log
- echo "get error log:"
- # 打包压缩错误日志文件
- cd ${logfilepath}
- tar zcvf ${backupfilepath}error/${logfilename}.tar.gz error_${logfilename}.log
- rm -rf error_${logfilename}.log
- echo "done @"${today}
nginx日志的切割脚本:
- #nginxlog日志备份
- #!/bin/sh
- # 设置日志文件备份文件名
- #logfilename=`date +%Y%m%d`
- logfilename=`date +\%Y\%m\%d -d "1 days ago"`
- # 设置日志文件原始路径
- logfilepath=/opt/modules/nginx/logs/
- # 设置日志备份文件路径
- backupfilepath=/opt/data/logs/nginx/
- LOG_FILE='access error log_mm log_db'
- for j in $LOG_FILE
- do
- cd ${logfilepath}
- tar zcvf ${backupfilepath}$j/${logfilename}.tar.gz $j.log
- rm -rf $j.log
- done
- kill -USR1 `cat /opt/modules/nginx/nginx.pid
日志定时清理的脚本:
- #!/bin/sh
- ####################### clear logs #########################
- ### nginx ###
- #clear nginx access log(by hour .log) 2 days ago
- /usr/bin/find /opt/data/logs/nginx/access -mtime +2 -name "access.log*" -exec rm -rf {} \;
- #clear nginx (access,error,log_mm,log_db) log(by day tar.gz) 10 days ago
- NGINX='access error log_mm log_db'
- for i in $NGINX
- do
- /usr/bin/find /opt/data/logs/nginx/$i -mtime +10 -name "*tar.gz" -exec rm -rf {} \;
- done
- ### apache ###
- #clear apache (access,error) log(by day tar.gz) 10 days ago
- APACHE='access error'
- for j in $APACHE
- do
- /usr/bin/find /opt/data/logs/apache/$j -mtime +10 -name "*tar.gz" -exec rm -rf {} \;
- done
- ### other log ###
- #clear (txt/mq,txt/auto,txt/man) log(by day .log) 10 days ago
- OTHER='txt/mq txt/auto txt/man'
- for k in $OTHER
- do
- /usr/bin/find /opt/data/logs/$k -mtime +10 -name "*log" -exec rm -rf {} \;
- done
日志常规分析脚本
1)日志的响应时间(分析响应时间超过2S的记录数量)
- #!/bin/sh
- DIR="/opt/data/logs/nginx/access"
- TIME=`date -d "1 hour ago" +%Y%m%d-%H`
- FILE=""
- if [ -z $1 ];then
- FILE="${FILE} ${DIR}/access.log${TIME}"
- else
- if [ $1 = 'h' ];then
- FILE="${FILE} ${DIR}/access.log${2}"
- else
- for((i=0;i<24;i++))
- do
- h=`printf "%02d" $i`
- FILE="${FILE} ${DIR}/access.log${2}-$h"
- done
- fi
- fi
- for f in ${FILE}
- do
- echo -n ${f}:
- grep -v 'proxy' ${f}| awk -F, 'BEGIN{f0=0;f1=0;f2=0}{ if($NF<1)f0++;if($NF>=1 && $NF<2)f1++;if($NF>=2 && $NF < 10000) f2++}END{print f0, f1, f2}'
- done
2)日志的请求状态(分析各请求状态的记录数量)