Earyant的技术博客

欢迎来到Earyant的技术博客,在这里我将与你分享新技术。

日志分析脚本

sed编辑器

不修改原内容的行级别流编辑器

  • sed ‘s/baidu /earyant/‘ access.log | head -10

    将日志文件中的baidu替换成earyant输出
    s表示执行的事文本替换命令

  • sed -n ‘2,6p’ access.log

    -n表示只输出指定的行,’2,6p’表示选择的事第二行到第六行

  • sed ‘/earyant/d’ access.log

    d表示执行文本删除命令,将包含earyant的行删除

  • sed ‘=’ access.log

    显示文本行号

  • sed -e ‘i\head’ access.log | head -10

    在行首插入文本

  • sed -e ‘a\end’ access.log | head -10

    在文末追加文本

  • sed -e ‘/baidu/c\hello’ access.log | head -10

    c命令对文本进行替换,查找/baidu/匹配的行,用hello对匹配的行进行替换,与s不同的是,这个替换行,s是替换单词

  • sed -n ‘1,5p;1,5=’ access.log

    多条命令,分号隔开

awk

  • awk ‘{print $1}’ access.log | head -10

    打印指定的列

  • awk ‘/baidu/{print $5,%6}’ access.log | head -10

    筛选指定的行,并且打印出其中一部分列

  • awk ‘length{$0} > 40 {print $3}’ access.log | head -10

    $0 表示当前的行,length($0)获取当前行的长度,print $3 打印出第三列

  • awk ‘{line = sprintf (“method:%s,response:%s”,$3,$7); print line}’ access.log | head -10

    定义line接收sprintf输出,sprintf用户格式化输出第三行的请求式和第七行的响应时间

shell

  • 系统load超过2或者磁盘利用率超过85%报警:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
#earyantlee@gmail.com

#top取系统load值, -n 1 表示只刷新一次
# sed 过滤第一行
# top命令会输出1分钟、5分钟、15分钟load的平均值,awk筛选出1分钟内的平均load,赋值给load
load = `top -n 1| sed -n '1p' | awk '{print $11}'`
# 从右边开始,过滤掉不需要的逗号
load = ${load%\,*}
# df取得磁盘利用率信息,用sed筛选磁盘总利用率第二行
disk_usage = `df -h | sed -n '2p' |awk '{print $(NF - 1)}' `
# 过滤掉百分号
disk_usage = ${disk_usage%\%*}
overhead = `expr $load \> 2.00`
if [$overhead -eq 1];then
echo "System load is overhead"
fi
if [$disk_usage -gt 85 ]; then
echo "disk is nearly full ,need more disk space"
fi
exit 0
  • 读取日志文件,对字段切割,插入到sql。
    db:
1
2
3
4
5
6
7
8
9
create table access_log(
ip varchar(20),# ip地址
rt bigint,# 响应时间
method varchar(10), #请求方式
url varchar (400), # 请求地址
refer varchar(400),# 请求来源
return_code int,# 返回码
response_size bigint # 响应大小
);

shell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
#earyantlee@gmail.com
# 日志路径
ACCESS_FILE="D:\\0\\nginx-1.11.13\\logs\\access2.log"
while read LINE
do
# 系统数组分隔符
OLD_IFS="$IFS"
IFS=" "
# 每行分割成数组
field_arr=($LINE)
IFS="$OLD_IFS"
# 生成插入语句,各列的值对应什么,懒得改了。
STATEMENT="insert into access_log values('${field_arr[0]}' , '${field_arr[1]}', '${field_arr[2]}', '${field_arr[3]}', '${field_arr[4]}', '${field_arr[5]}', '${field_arr[6]}');"
echo $STATEMENT
mysql earyant -u root -p123456 -e "${STATEMENT}"
done < $ACCESS_FILE
exit 0

欢迎关注我的其它发布渠道