Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。
大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 /etc/syslogd 或/etc/rsyslog.d,默认配置文件为 /etc/syslog.conf 或 rsyslog.conf,任何希望生成日志的程序都可以向 syslog 发送信息。
Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。
完成这个过程的程序就是syslog。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。
例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。默认配置下,日志文件通常都保存在“/var/log”目录下。
下面是常见的日志类型,但并不是所有的Linux发行版都包含这些类型:
类型 | 说明 |
---|---|
auth | 用户认证时产生的日志,如login命令、su命令。 |
authpriv | 与 auth 类似,但是只能被特定用户查看。 |
console | 针对系统控制台的消息。 |
cron | 系统定期执行计划任务时产生的日志。 |
daemon | 某些守护进程产生的日志。 |
ftp | FTP服务。 |
kern | 系统内核消息。 |
local0.local7 | 由自定义程序使用。 |
lpr | 与打印机活动有关。 |
邮件日志。 | |
mark | 产生时间戳。系统每隔一段时间向日志文件中输出当前时间,每行的格式类似于 May 26 11:17:09 rs2 -- MARK --,可以由此推断系统发生故障的大概时间。 |
news | 网络新闻传输协议(nntp)产生的消息。 |
ntp | 网络时间协议(ntp)产生的消息。 |
user | 用户进程。 |
uucp | UUCP子系统。 |
常见的日志优先级请见下标:
优先级 | 说明 |
---|---|
emerg | 紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。 |
alert | 需要立即修复,例如系统数据库损坏。 |
crit | 危险情况,例如硬盘错误,可能会阻碍程序的部分功能。 |
err | 一般错误消息。 |
warning | 警告。 |
notice | 不是错误,但是可能需要处理。 |
info | 通用性消息,一般用来提供有用信息。 |
debug | 调试程序产生的信息。 |
none | 没有优先级,不记录任何日志消息。 |
系统日志是由一个名为syslog的服务管理的,如以下日志文件都是由syslog日志服务驱动的:
/var/log/boot.log:录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息
/var/log/lastlog :记录最后一次用户成功登陆的时间、登陆IP等信息
/var/log/messages :记录Linux操作系统常见的系统和服务错误信息
/var/log/secure :Linux系统安全日志,记录用户和工作组变坏情况、用户登陆认证情况
/var/log/btmp :记录Linux登陆失败的用户、时间以及远程IP地址
/var/log/syslog:只记录警告信息,常常是系统出问题的信息,使用lastlog查看
/var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看
/var/run/utmp:该日志文件记录有关当前登录的每个用户的信息。如 who、w、users、finger等就需要访问这个文件
/var/log/syslog 或 /var/log/messages 存储所有的全局系统活动数据,包括开机信息。基于 Debian 的系统如 Ubuntu 在 /var/log/syslog 中存储它们,而基于 RedHat 的系统如 RHEL 或 CentOS 则在 /var/log/messages 中存储它们。
/var/log/auth.log 或 /var/log/secure 存储来自可插拔认证模块(PAM)的日志,包括成功的登录,失败的登录尝试和认证方式。Ubuntu 和 Debian 在 /var/log/auth.log 中存储认证信息,而 RedHat 和 CentOS 则在 /var/log/secure 中存储该信息。
日志文件详细介绍:
/var/log/boot.log
该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示:
/var/log/syslog
默认Centos,Fedora不生成该日志文件,但可以配置/etc/syslog.conf让系统生成该日志文件。
它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信息,所以更应该关注该文件。
要让系统生成该日志文件,在/etc/syslog.conf文件中加上:*.warning /var/log/syslog 该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息。
该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。在每次用户登录时被查询,该文件是二进制文件,需要使用lastlog命令查看,根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过,就显示为"**Never logged in**"。该命令只能以root权限执行。简单地输入lastlog命令后就会看到类似图4的信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@TestStation etc]# lastlog
Username Port From Latest
root pts/0 110.87.109.232 Wed Nov 2 10:34:20 +0800 2016
bin **Never logged
in
**
daemon **Never logged
in
**
adm **Never logged
in
**
lp **Never logged
in
**
sync **Never logged
in
**
shutdown **Never logged
in
**
halt **Never logged
in
**
mail **Never logged
in
**
uucp **Never logged
in
**
operator
**Never logged
in
**
games **Never logged
in
**
gopher **Never logged
in
**
ftp **Never logged
in
**
nobody **Never logged
in
**
vcsa **Never logged
in
**
saslauth **Never logged
in
**
postfix **Never logged
in
**
sshd **Never logged
in
**
ntp **Never logged
in
**
suda pts/2 222.79.79.120 Tue Oct 25 16:00:01 +0800 2016
|
/var/log/wtmp
该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录。
/var/run/utmp
该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。
以上提及的3个文件(/var/log/wtmp、/var/run/utmp、/var/log/lastlog)是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故不能用less、cat之类的命令直接查看这些文件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而lastlog文件则使用另外的数据结构,关于它们的具体的数据结构可以使用man命令查询。
每次有一个用户登录时,login程序在文件lastlog中查看用户的UID。如果存在,则把用户上次登录、注销时间和主机名写到标准输出中,然后login程序在lastlog中记录新的登录时间,打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。utmp文件被各种命令使用,包括who、w、users和finger。
下一步,login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时,具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。
消息:
Jan 7 15:31:37 pandora2 ssshd[16367]: Accepted password for craigz from 192.168.1.2222 port 5242 ssh2
格式: Date time hostname process[pid]: action:version
logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。
编辑syslog.conf,
#vi /etc/syslog.conf
在第一行加入local3.none,使得设备local3的日志不记录在messages文件里,
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages
将设备local3的所有级别的信息都记录在userlog文件里,
#user log
local3.* /var/log/userlog
重新加载syslog服务的配置文件,
$ service syslog reload
2、测试:
测试机器的环境:
OS:Red Hat Enterprise Linux 5 update 3
Network: 192.168.0.100/24 Gateway:192.168.0.1
$ ping 192.168.0.1 | logger -it logger_test -p local3.notice &
命令logger -it logger_test -p local3.notice中的参数含义:
-i 在每行都记录进程ID
-t logger_test 每行记录都加上“logger_test”这个标签
-p local3.notice 设置记录的设备和级别
ping命令的输出成功输出到/var/log/userlog文件中,实验成功。
3、logger命令默认的日志保存在 /var/log/messages中,例如:
命令:logger -p local7.info -t test_logger_message "test_message"
输出:tail -f /var/log/messages
Mar 17 22:41:54 localhost log_test[8673]: test_message
日志回卷
系统时时刻刻都在产生日志,如果不及时清理,很快就会灌满硬盘,但如果要手工清理,又很麻烦。这种情况下,logrotate 这个程序很好的完成这个任务。
logrotate 用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过一个叫做crond的守护进程来执行,logrotate 还可以用于压缩日志文件,以及发送日志到指定的E-mail 。
实验描述:
(1)用Cron执行logrotate命令,每分钟检查一次目标日志文件是否满足回卷限制。(2)配置/etc/logrotate.conf 或者建立一个自定义的/etc/logrotate.d /userlog
(3)编辑/etc/syslog.conf 使得记录的日志信息可以写入到/var/log/userlog中。
$ crontab -e
* * * * * /usr/sbin/logrotate /etc/logrotate.conf //写入这条命令
$ vi /etc/logrotate.conf
***省略***
/var/log/userlog {
daily
size 10k 在这里单位大小写敏感应,应为 k or M
create 0664 root root
rotate 3
prerotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null
endscript
}
在这里一定要加prerotate这段脚本,这样可以使syslog程序重新读取配置文件,这样做的作用是让syslog程序释放对userlog文件持有的文件描述符,否则即使日志文件回滚,syslog也不会向新产生的日志文件写数据。举个例子,如果不加这段脚本,即使logrotate程序将userlog文件截断并重命名为userlog.1,但是syslog程序仍然会向原userlog文件即userlog.1中写入数据。
$ vi /etc/syslog.conf
*****省略*****
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages
#user log
local3.* /var/log/userlog
重新加载配置文件
$ service syslog reload
重启crond服务
$ service crond restart
需要注意的是,当达到限制条件时,logrotate程序会将目标日志文件userlog截断,并命名为userlog.1,将原userlog.1改名为userlog.2,以此类推,syslog程序始终向userlog文件中写数据。
logwatch介绍:
1)logwatch是一款用Perl 语言编写的开源日志解析分析器。它能对原始的日志文件进行解析并转换成结构化格式的文档,也能根据您的使用情况和需求来定制报告。logwatch的主要目的是生成更易于使用的日志摘要,并不是用来对日志进行实时的处理和监控的。正因为如此,logwatch通常被设定好时间和频率的自动定时任务来调度运行或者是有需要日志处理的时候从命令行里手动运行。一旦日志报告生成,logwatch 可以通过电子邮件把这报告发送给您,您可以把它保存成文件或者直接显示在屏幕上。
2)Logwatch报告的详细程度和报告覆盖范围是完全可定制化的。Logwatch 的日志处理引擎也是可扩展的,从某种意义上来说,如果您想在一个新的应用程序中使用 logwatch 功能的话,只需要为这个应用程序的日志文件编写一个日志处理脚本(使用 Perl 语言),然后挂接到 logwatch 上就行。
3)logwatch的缺点就在于:在它生成的报告中没有详细的时间戳信息,而原来的日志文件中是存在的。只能知道被记录下来的一段时间之内的特定事件,如果想要知道精确的时间点的信息,就不得不去查看原日志文件了。
logwatch安装
Logwatch能够对Linux 日志文件进行分析,并自动发送mail给相关处理人员,可定制需求。Logwatch的mail功能是借助宿主系统自带的mail server发邮件的,所以系统需安装mail server(如sendmail,postfix等)
apt-get install logwatch
1)直接命令行手动监控
1
2
|
[root@xqsj-beta ~]
# logwatch --detail 10 --mailto [email protected] --range all --service all --output mail
[root@xqsj-beta ~]
#
|
上面命令中采用的是邮箱格式的报告输出,如下:
下面采用html格式的报告输出,通常情况下,我都会使用这个格式:
1
2
3
4
5
6
|
[root@xqsj-beta ~]
# logwatch --detail 10 --mailto [email protected] --range all --service all --output html
[root@xqsj-beta ~]
#
若是想发送给多个邮箱,中间需要用逗号隔开
[root@xqsj-beta ~]
# logwatch --detail 10 --mailto [email protected],wang_shibo***@163.com --range all --service all --output html
[root@xqsj-beta ~]
#
|
收到的邮件中的监控报告如下:
注意一个细节:
如上在邮箱里发现报告里的内容太多,有一些无关紧要的服务的监控结果不想打印在报告里,那么就可以在监控时过滤掉这些服务项。
可以对比邮件里出现的监控列表里的服务去过滤,服务名最后以/etc/logwatch/scripts/services下的名称为准,服务名不正确,会报错说不识别。如下:
1
2
|
[root@xqsj-beta services]
# logwatch --detail 10 --mailto [email protected] --range all --service All --service -XNTPD --service -Kernel --service -http --service -Postfix --service -pam_unix --service -XNTPD --output html
[root@xqsj-beta services]
#
|
再次查看邮件,发现被过滤掉的服务的监控结果就不会出现在报告里了
这种方式不需要logwatch的配置文件,比较简单,可以将执行命令放到shell脚本中,结合crontab每天定时执行!
----------------------------------------------------------------------------------------------
发送邮件的时候报错如下:
You have old files in your logwatch tmpdir (/var/cache/logwatch):
logwatch.A3V8WQ6_
The directories listed above were most likely created by a
logwatch run that failed to complete successfully. If so, you
may delete these directories.
解决办法:
# rm -rf /var/cache/logwatch/*
-------------------------------------------------------------------------------------------
2)采用配置文件的方式
需要编辑的文件是/etc/logwatch/conf/logwatch.conf,以下是对配置选项的解释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
1)LogDir =
/var/log
定义的日志文件存放路径
2)TmpDir =
/var/cache/logwatch
定义的缓存路径
3)Save =
/tmp/logwatch
开启此项, 会将处理结果保存到本地文件里,如
/tmp/logwatch
文件, 不会邮寄或显示输出。一般会注释掉此行或不配置此行
4)MailTo = [email protected]
发送监控报告的收件人地址,发送给多个邮箱,需要在多个邮箱地址之间用逗号隔开。但是需要在logwatch运行的服务器上配置好本地邮件传输代理(MTA)如sendmail、 Postfix等,这个配置指令项才能起作用。
5)MailFrom = Logwatch
当你收到邮件时, 显示是谁发给你的。默认是Logwatch
6)Range =
处理什么时候的日志 , 可选项 All , Yesterday , Today , 即所有, 昨天的 , 今天的。
7)Detail = High
日志详细度, 可选项 Low , Med , High , 或是 0-10数字
8)Print = No
可选项, Yes会被打印到系统标准输出, 并且不会以邮件的形式发送到MailTo设定的邮箱里 , No选项则会发到邮箱中。
9)Server = All
监控的服务项,all表示所有的服务。这个可以到
/etc/logwatch/scripts/services/
下面去找要监控的服务名称,默认是空的,可以从
/usr/share/logwatch/scripts/services
下面将服务监控脚本拷贝过来。
Service选项指定想要监控的一个或多个服务。在
/usr/share/logwatch/scripts/services
目录下列出的服务都能被监控,它们已经涵盖了重要的系统服务(例如:pam,secure,iptables,syslogd 等),也涵盖了一些像
sudo
、sshd、http、fail2ban、samba等主流的应用服务。如果您想添加新的服务到列表中,得编写一个相应的日志处理 Perl 脚本,并把它放在这个目录中。
如果这个选项要用来选择特定的服务话,您需要把文件中的
"Service = All "
这一行注释掉。
另外注意一点:
可以在不监控的服务前面加
"-"
, 如
"-httpd"
即表示不监控httpd服务,可以写多条。
一般我们建议的配置是:先监控所有服务,然后在排除不需要监控的服务,比如:
Service = All
Service =
"-zz-network"
Service =
"-zz-sys"
Service =
"-eximstats"
10)output =
配置指令定义了一份 logwatch 报告的格式。有mail邮箱格式和html格式。
|
下面是自己线上服务器上使用过的一个配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
[root@xqsj-beta ~]
# cat /etc/logwatch/conf/logwatch.conf
# Local configuration options go here (defaults are in /usr/share/logwatch/default.conf/logwatch.conf)
LogDir =
/var/log
TmpDir =
/var/cache/logwatch
#Save = /tmp/logwatch
MailTo = [email protected],[email protected]
MailFrom = Logwatch
Range = Yesterday
Detail = High
Print = No
Service = All
Service =
"-XNTPD"
Service =
"-Kernel"
Service =
"-http"
Service =
"-Postfix"
Service =
"-pam_unix"
Service =
"-XNTPD"
output = html
然后手动执行下命令:
[root@xqsj-beta ~]
# /usr/sbin/logwatch
[root@xqsj-beta ~]
#
然后去对应的邮箱里查看,发现已有报告邮件。
|
另外注意:
logwatch的工作不是监控日志异常后及时报警的工具,并不具有及时性,logwatch默认每天定时发送一封整合的邮件:
logwatch默认在crontab定时任务设定目录下存在/etc/cron.daily/0logwatch脚本:
1
2
3
4
5
6
7
8
9
|
[root@xqsj-beta ~]
# cat /etc/cron.daily/0logwatch
#!/bin/bash
DailyReport=`
grep
-e
"^[[:space:]]*DailyReport[[:space:]]*=[[:space:]]*"
/usr/share/logwatch/default
.conf
/logwatch
.conf |
head
-n1 |
sed
-e
"s|^\s*DailyReport\s*=\s*||"
`
if
[
"$DailyReport"
!=
"No"
] && [
"$DailyReport"
!=
"no"
]
then
logwatch
fi
|
正是因为这个默认的定时脚本,所以只要如上配置好logwatch.conf文件后,每天都会自动收取一封整合的报告邮件
如果在logwatch.conf中显式设置了选项DailyReport = No,则会取消logwatch每日执行任务。
如果要修改logwatch在cron.daily的执行时间,可以删掉/etc/cron.daily/0logwatch这个文件,然后添加到/etc/crontab里去定义执行时间。即:
1
2
3
4
5
|
[root@xqsj-beta ~]
# mv /etc/cron.daily/0logwatch /root/logwatch.sh
比如设定每天早上5点发送邮件
[root@xqsj-beta ~]
# crontab -e
0 5 * * *
/bin/bash
-x
/root/logwatch
.sh
|
又或者是删除/etc/cron.daily/0logwatch文件,然后自己在crontab里自定义发送:
1
2
3
|
每周1-5的早上8点发送邮件
[root@xqsj-beta ~]
# crontab -e
0 8 * * 1,2,3,4,5
/usr/sbin/logwatch
|
-a 把从何处登入系统的主机名称或ip地址,显示在最后一行。
-d 指定记录文件。指定记录文件。将IP地址转换成主机名称。
-f <记录文件> 指定记录文件。
-n <显示列数>或-<显示列数> 设置列出名单的显示列数。
-R 不显示登入系统的主机名称或IP地址。
-x 显示系统关机,重新开机,以及执行等级的改变等信息
以下看所有的重启、关机记录
last | grep reboot
last | grep shutdown
列出所有的历史记录:
[zzs@Linux] # history
只列出最近10条记录:
[zzs@linux] # history 10 (注,history和10中间有空格)
使用命令记录号码执行命令,执行历史清单中的第99条命令
[zzs@linux] #!99 (!和99中间没有空格)
重复执行上一个命令
[zzs@linux] #!!
执行最后一次以rpm开头的命令(!? ?代表的是字符串,这个String可以随便输,Shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。)
[zzs@linux] #!rpm
逐屏列出所有的历史记录:
[zzs@linux]# history | more
立即清空history当前所有历史命令的记录
[zzs@linux] #history -c
系统所有的日志都在 /var/log 下面自己看(具体用途可以自己查,附录列出一些常用的日志)
cat /var/log/syslog 等 cat /var/log/*.log
如果日志在更新,如何实时查看 tail -f /var/log/messages
还可以使用 watch -d -n 1 cat /var/log/messages
-d表示高亮不同的地方,-n表示多少秒刷新一次。
该指令,不会直接返回命令行,而是实时打印日志文件中新增加的内容,
这一特性,对于查看日志是非常有效的。如果想终止输出,按 Ctrl+C 即可。