Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。
大部分Linux发行版默认的日志守护进程为 rsyslog,位于 /etc/rsyslog 或 /etc/rsyslogd,默认配置文件为 /etc/rsyslog.conf,任何希望生成日志的程序都可以向 rsyslog 发送信息。
Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。完成这个过程的程序就是rsyslog。
rsyslog可以根据日志的类别和优先级将日志保存到不同的文件中。例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。默认配置下,日志文件通常都保存在“/var/log”目录下.
日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
1、常见的日志文件及说明
日志文件 | 说明 |
---|---|
/var/log/cron | 记录了系统定时任务相关的日志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
/var/log/message | 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件,但由于记录的信息太杂,一般不查看 |
/var/log/btmp | 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看 |
/var/log/lastlog | 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看 |
/var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看 |
/var/log/utmp | 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询 |
/var/log/secure | 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
2、日志分析技巧
(1)常用的shell命令
1.1> find命令:在目录中查找指定文件
选项:-name: 按照文件名搜索;通配符*表示匹配所有,?表示匹配单个字符;
-iname: 按照文件名搜索,但不区分文件名的大小写;
1.2> grep命令:在文件中搜寻匹配的行并输出
选项: -i(忽略大、小写)
-v(反转查找)
-r 是递归查找
-n 是显示行号
-R 查找所有文件包含子目录
查找以某字符串为开头: "^某字符串" 例如:grep "^#" /etc/inittab
查找以某字符串为结尾: "某字符串$" 例如:grep ")$" /etc/inittab
查找空行: "^$" 例如:grep "^$" /etc/inittab
1.3> awk命令:查找文本,输出匹配的内容
awk 由 2 部分组成,分别为匹配规则和执行命令,如:'匹配规则{执行命令}'
举个简单的例子: awk '/^$/ {print "Blank line"}' test.txt
在此命令中,
/^$/
是一个正则表达式,功能是匹配文本中的空白行,同时可以看到,执行命令使用的是 print 命令,此命令经常会使用,它的作用很简单,就是将指定的文本进行输出。因此,整个命令的功能是,如果 test.txt 有 N 个空白行,那么执行此命令会输出 N 个 Blank line。
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段,字段分隔符是任意的空白字符(例如空格或制表符):
- $0 代表整个文本行;
- $1 代表文本行中的第 1 个数据字段;
- $2 代表文本行中的第 2 个数据字段;
- $n 代表文本行中的第 n 个数据字段。
当然,如果你要读取采用了其他字段分隔符的文件,可以用 -F 选项手动指定。
1.4> sort命令:对文件进行排序
sort – 参数 文件名 对文件进行排序
选项:-n 对文件按照数字排序
-r 反向排序
-u 去除重复行
-c 显示数据重复的次数
1.5> wc命令:统计
wc -参数 文件名 统计文本大小,字符多少,行数
选项:-c 统计文本字节数
-m 统计文本字符数
-l 统计文本有多少行
分析日志时,一般是将grep、awk、find、wc等命令结合起来使用,筛选出所需的信息,进行分析。
(2)日志分析
这里找了一个web日志如下,方法和思路大致都差不多:cat test
root@root:~# cat test
218.201.102.54,-,-,[29/Jun/2017:03:25:06,+0800],GET /download/nps/squid_bg.jpg
131.253.27.125,-,-,[29/Jun/2017:03:29:53,+0800],GET /api.php?op=count&id=2205&modelid=1
121.43.187.150,-,-,[29/Jun/2017:03:31:47,+0800],GET /index.php?m=formguide&c=index&a=show&formid=62&action=js&siteid=1
121.43.187.150,-,-,[29/Jun/2017:03:31:47,+0800],GET /index.php?m=formguide&c=index&a=show&formid=59&action=js&siteid=1
121.43.187.150,-,-,[29/Jun/2017:03:31:47,+0800],GET /api.php?op=count&id=&modelid=1
121.43.187.150,-,-,[29/Jun/2017:03:31:49,+0800],GET /api.php?op=checkcode&code_len=4&font_size=14&width=84&height=24&font_color=&background=
131.253.27.93,-,-,[29/Jun/2017:03:32:37,+0800],GET /api.php?op=count&id=2135&modelid=1
121.43.173.126,-,-,[29/Jun/2017:03:34:12,+0800],GET /index.php?m=formguide&c=index&a=show&formid=62&action=js&siteid=1
121.43.173.126,-,-,[29/Jun/2017:03:34:12,+0800],GET /index.php?m=formguide&c=index&a=show&formid=59&action=js&siteid=1
121.43.173.126,-,-,[29/Jun/2017:03:34:13,+0800],GET /api.php?op=count&id=&modelid=1
121.43.173.126,-,-,[29/Jun/2017:03:34:13,+0800],GET /api.php?op=checkcode&code_len=4&font_size=14&width=84&height=24&font_color=&background=1
42.156.136.14,-,-,[29/Jun/2017:03:37:31,+0800],GET /index.php?m=formguide&c=index&a=show&formid=62&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:31,+0800],GET /index.php?m=formguide&c=index&a=show&formid=59&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:31,+0800],GET /api.php?op=count&id=&modelid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:32,+0800],GET /index.php?m=formguide&c=index&a=show&formid=62&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:32,+0800],GET /index.php?m=formguide&c=index&a=show&formid=59&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:33,+0800],GET /api.php?op=count&id=&modelid=1
2.1> 查看当天有多少个IP访问
root@root:~# cat test | awk -F ',-,-,' '{print $1}'|sort |uniq|wc -l
6
root@root:~# cat test | awk -F ',-,-,' '{print $1}'|sort |uniq
121.43.173.126
121.43.187.150
131.253.27.125
131.253.27.93
218.201.102.54
42.156.136.14
2.2> 查看某一个页面被访问的次数
root@root:~# grep /api.php test |wc -l
8
2.3> 查看每一个IP访问了多少个页面
root@root:~# awk -F ',-,-,' '{++S[$1]} END {for (a in S) print a,S[a]}' test
42.156.136.14 6
131.253.27.125 1
121.43.173.126 4
131.253.27.93 1
121.43.187.150 4
218.201.102.54 1
2.4> 把每个IP访问的页面数进行排序
root@root:~# awk -F ',-,-,' '{++S[$1]} END {for (a in S) print a,S[a]}' test | sort -n
42.156.136.14 6
121.43.173.126 4
121.43.187.150 4
131.253.27.125 1
131.253.27.93 1
218.201.102.54 1
2.5> 获取访问量最多的3个IP
root@root:~# awk -F ',-,-,' '{++S[$1]} END {for (a in S) print a,S[a]}' test | sort -n|head -3
42.156.136.14 6
121.43.173.126 4
121.43.187.150 4
2.6> 查询某一个IP访问了哪些页面
root@root:~# grep ^42.156.136.14 test
42.156.136.14,-,-,[29/Jun/2017:03:37:31,+0800],GET /index.php?m=formguide&c=index&a=show&formid=62&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:31,+0800],GET /index.php?m=formguide&c=index&a=show&formid=59&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:31,+0800],GET /api.php?op=count&id=&modelid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:32,+0800],GET /index.php?m=formguide&c=index&a=show&formid=62&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:32,+0800],GET /index.php?m=formguide&c=index&a=show&formid=59&action=js&siteid=1
42.156.136.14,-,-,[29/Jun/2017:03:37:33,+0800],GET /api.php?op=count&id=&modelid=1
2.7> 查看2017年7月9日3时这一个小时内有多少IP访问
root@root:~# grep 9/Jun/2017:03 test | awk -F ',-,-,' '{print $1}' | sort -u
121.43.173.126
121.43.187.150
131.253.27.125
131.253.27.93
218.201.102.54
42.156.136.14
root@root:~# grep 9/Jun/2017:03 test | awk -F ',-,-,' '{print $1}' | sort -u |wc -l
6
参考链接:https://github.com/Bypass007/Emergency-Response-Notes/blob/master/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90/%E7%AC%AC2%E7%AF%87%EF%BC%9ALinux%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90.md