Linux系统日志分析与管理
当你的 Linux 系统出现不明原因的问题时,你需要查阅一下系统日志才能够知道系统出了什么问题了,所以说了解系统日志是很重要的事情,系统日志可以记录系统在什么时间、哪个主机、哪个服务、出现了什么信息等,这些信息也包括使用者识别数据、系统故障排除等,如果你能够善用这些日志文件信息的话,你的系统出现错误时,你将可以在第一时间发现,而且也能够从中找到解决的方案.
Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去,完成这个过程的程序就是syslog,syslog可以根据日志的类别和优先级将日志保存到不同的文件中.
文章声明
该系列文章部分文字描述,整理于以下文献,化繁为简.
《鸟哥的Linux私房菜 (基础学习篇 第三版)》 – 作者:鸟哥
《Linux就该这么学》 – 作者:刘遄
关于Linux常见的日志文件名及作用
日志文件可以帮助我们了解很多系统重要的事件,包括登陆者的部分信息,因此日志文件的权限通常是配置为仅有 root 能够读取而已,而由于日志文件可以记录很多的系统详细信息,所以,一个有经验的Linux管理员会随时随地查阅一下自己的日志文件,以随时掌握系统的最新动态,那么常见的日志文件有哪些呢? 一般而言有下面几个:
● /var/log/cron
主要记录关于crontab计划任务的相关信息,比如,系统计划任务的错误配置,计划任务的修改等.
● /var/log/btmp
记录错误登陆日志,这个文件是二进制的,不能使用cat命令查看,而要使用lastb命令查看.
● /var/run/utmp
记录当前一登陆用户的信息,同样不能使用cat命令查看,而要使用w,who,users命令来查询.
● /var/log/dmesg
主要记录系统在开机时内核检测过程所产生的信息,默认情况下RHEL系统关闭了开机回显,如果你要查看则需要在这个文件下查阅即可.
● /var/log/lastlog
记录了系统上面所有账户最近一次登陆系统时的相关信息,lastlog命令就是读取这个文件里的记录来显示的.
● /var/log/malilog or /var/log/mail/*
记录着邮件的往来信息,默认是postfix邮件服务器的一些信息.
● /var/log/messages
这个文件非常重要,几乎系统发生的错误信息,或者重要信息都会被记录在这里.
● /var/log/secure
只要涉及到需要用户名和密码的操作,那么当登陆系统是(不论正确错误),都会记录到这里.
● /var/log/wtmp or /var/log/faillog
这两个文件可以记录正确登陆系统者的账户信息(wtmp),与错误登陆时所使用的账户信息,last命令就是读取wtmp文件来获取的.
常见的日志文件就是这几个,但是不同的 Linux 发行版,通常日志文件的名称和存储目录都不会相同,但此处除了/var/log/messages 之外,所以说你还是得要查阅你 Linux 主机上面的日志文件配置数据,才能知道你的日志文件主要是放在哪里了.
日志文件所需相关服务与进程
其实日志文件的产生,基本上有两种方式:一种是有软件开发商自定义写入的日志文件与相关格式,另一种则是由Linux发行商提供的日志文件管理服务来统一管理,你只要将这个信息丢给这个服务,它就会自己分门别类的放置到相关的日志文件中去,RHEL系统提供syslogd这个服务来统一管理日志文件.
除了syslogd这个服务之外,内核也需要额外的登陆服务来记录内核产生的各项信息,这个专门用来记录内核日志的服务就是klogd.所以说,日志文件所需的服务主要是syslogd与klogd这两者.
不过需要注意的是,由于系统每天都在产生大量的日志,如果日志文件量太大,就会影响系统的正常运转,这时候我们可以通过logrtate来自动处理日志文件与切割更新的问题.
所谓logrotate(日志轮询),基本上就是将旧的文件改变名称,然后新建一个空文件,如此一来新的日志文件将重新开始记录,这样就可以实现日志轮询啦,总结一下,针对日志文件所需的功能,我们需要的服务与程序有以下几个:
syslogd:主要登陆系统与网络等服务的信息
klogd:主要登陆内核产生的各项信息
logrotate:主要进行日志文件的轮询
以上就是关于日志相关的常用常识,下面我们将开始实际看一下日志服务的应用技巧.
SYSlog日志文件的格式
一般情况下,系统产生的信息经过syslog而记录下来的数据中,每条信息均会记录下面的几个数据.
● 事件发生的日期与时间
● 发生此事件的主机名
● 启动此事件的服务名,或函数名
● 该信息的实际数据内容
当然这些信息日志的详细程度也是可以修改的,而且这些信息可以作为系统的排错之用,下面我们来看一下 /var/log/secure
这个日志文件,来简单介绍一下它的记录格式吧.
[root@localhost ~]# cat /var/log/secure | head -n 5
Oct 13 12:39:27 localhost polkitd[733]: Loading rules from directory /etc/polkit-1/rules.d
Oct 13 12:39:27 localhost polkitd[733]: Acquired the name org.freedesktop.PolicyKit1 on the system bus
Oct 13 12:39:33 localhost sshd[1082]: Server listening on 0.0.0.0 port 22.
Nov 28 09:36:41 localhost sshd[1364]: Accepted password for root from 192.168.1.20 port 63704 ssh2
Nov 28 05:36:41 localhost sshd[1364]: pam_unix(sshd:session): session opened for user root by (uid=0)
我们拿最后一条数据来说,该数据是说:在11月28号的下午5点36分,由localhost这台主机,通过sshd服务pid号是1364传来的消息,这个消息是通过pam_unix这个模块产生的,内容为session opened for user root by (uid=0),root开启了活动.
SYSlog配置文件的解析
其实日志文件也有配置文件,它的目录是 /etc/rsyslog.conf
基本上syslog针对各种服务于信息的记录保存在这个配置文件里,这个文件规定了什么服务什么等级信息,以及需要被记录在哪里,这三个东西,所以它的语法会是下面的样子:
[服务名称] .=! [信息等级] [记录到哪里]
authpriv.* /var/log/secure
mail.info -/var/log/maillog
cron.* /var/log/cron
好了,接下来我们分成三个部分来解释这几信息的含义.
[服务名称]
syslog本身有设置一些服务,你可以通过这些服务来存储系统信息,syslog涉及的服务主要有以下这些:
服 务 类 型 | 说 明 |
---|---|
auth(authpriv) | 与认证有关的机制,例如login,ssh,su等需要账号密码 |
cron | 例行工作调度,cron/at等生成信息日志的地方 |
daemon | 与这个daemon有关的信息 |
kern | 内核产生的信息 |
lpr | 打印相关的信息 |
只要与邮件有关的信息都记录在这里 | |
news | 与新闻组服务器有关的东西 |
syslog | syslogd本身生成的信息 |
user,uucp,local0-local7 | 与Unix-Like机器本身有关的一些信息 |
对配置文件的几点说明:
● 日志类型和优先级由点号(.)分开,例如 kern.debug 表示由内核产生的调试信息
● kern.debug 的优先级大于 debug
● 星号(*)表示所有,例如 .debug 表示所有类型的调试信息,kern. 表示由内核产生的所有消息
● 可以使用逗号(,)分隔多个日志类型,使用分号(;)分隔多个选择器
对日志的操作包括:
● 将日志输出到文件,例如 /var/log/maillog 或 /dev/console
● 将消息发送给用户,多个用户用逗号(,)分隔,例如 root,amrood
● 通过管道将消息发送给用户程序,注意程序要放在管道符(|)后面
● 将消息发送给其他主机上的 syslog 进程,这时 /etc/syslog.conf文件后面一列为以@开头的主机名(IP)
[信息等级]
同一个服务所产生的信息也是有差别的,有启动时仅通知系统而已的一般信息(information),有出现还不至于影响到正常运行的警告信息 (warn),还有系统硬件发生严重错误时,所产生的重大问题信息(error),基本上syslog将信息分为七个主要的等级,依序是这样的(由不重要排列到重要信息等级).
等 级 信 息 | 说 明 |
---|---|
debug | 一般调试信息 |
info | 基本通知信息 |
notice | 普通通知信息 |
warning(warn) | 警告信息,但不影响正常使用 |
err(error) | 错误信息,可能影响系统服务 |
crit | 比错误信息还严重的错误信息 |
alert | 警告,比crit还严重的警告 |
emerg(panic) | 疼痛等级,系统已经完蛋了 |
* | 代表所有日志等级 |
好了,上面的介绍足够生产环境的使用啦,如果想配置自定义日志位置,我想你能够搞定了.
SYSlog日志服务器配置
想像一个环境,你的办公室内有一百台 Linux 主机,每一台负责一个网络服务,你为了要了解每台主机的状态,因此你常常需要登陆这一百主机去检查你的日志文件,想想是不是很骚,幸好我们的日志服务可以集中管理,这样我们只需要一台服务器当作日志服务器,其他客户端主动同步数据就好啦,是不是很方便啊.
我们的RHEL系统,默认的syslog本身就已经具有这个日志文件服务器的功能了,只是默认并没有启动该功能而已,既然是日志服务器那么我们的 Linux 主机当然会启动一个端口来监听了,那个默认的端口就是 UDP 的 514 啊.
◆接收端配置◆
1.首先编辑日志服务器的配置文件,开启相应的注释,此处既可以使用TCP也可以使用UDP,两者都可.
[root@localhost ~]# vim /etc/rsyslog.conf
14 # Provides UDP syslog reception
15 $ModLoad imudp #此处我们开启UDP的即可
16 $UDPServerRun 514
17
18 # Provides TCP syslog reception
19 #$ModLoad imtcp
20 #$InputTCPServerRun 514
2.重启日志服务器,即可配置完成
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-11-28 10:33:26 EST; 6s ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 13746 (rsyslogd)
CGroup: /system.slice/rsyslog.service
└─13746 /usr/sbin/rsyslogd -n
通过这个简单的操作,你的 Linux 主机已经可以接收来自其他主机的日志文件了,这里还要进行防火墙的规则放行制定端口,此处略过.
◆发送端配置◆
至于发送端的配置就简单多了,只要指定某个信息传送到这部主机即可,举例来说,我们的日志服务器 IP=192.168.1.10 ,而客户端希望所有的数据都送给主机,我们可以进行一下操作.
1.修改日志配置文件,添加以下数据,保存退出即可.
90 #*.* @@remote-host:514
91 # ### end of the forwarding rule ###
92
93 *.* @192.168.1.10
注意:可以使用 UDP 用一个@
可以使用 TCP 用两个@@
2.重启日志工具,即可配置完成
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-11-28 10:33:26 EST; 6s ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 13746 (rsyslogd)
CGroup: /system.slice/rsyslog.service
└─13746 /usr/sbin/rsyslogd -n
SYSlog日志的轮替功能
syslog 利用的是 daemon 的方式来启动的,当有需求的时候立刻就会被运行的,但是 logrotate 却是在规定的时间到了之后才来进行日志文件的轮替,所以这个 logrotate 程序当然就是挂在 cron 底下进行的,仔细看一下 /etc/cron.daily/里面的文件,/etc/cron.daily/logrotate 就是记录了每天要进行的日志文件轮替的行为啦.
一般情况下,日志的轮替会用到两个配置文件,分别是 /etc/logrotate.conf
和 /etc/logrotate.d/
这两个目录,首先我们来看一下,/etc/logrotate.conf
这个文件里的内容吧.
[root@localhost ~]# cat /etc/logrotate.conf
weekly #默认每个礼拜进行轮询
rotate 4 #保留几个日志文件
create #日志文件被重命名,新建日志文件存储
dateext
#compress #压缩轮询后的日志
include /etc/logrotate.d #导入其他日志配置文件
/var/log/wtmp { #针对/var/log/wtmp所设置的参数
monthly #每月轮替
create 0664 root utmp #指定新建文件的权限,以及所有者和所属组
minsize 1M #大于1M后轮询
rotate 1 #仅保留一个wtmp.1而已
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
其他的常用格式如下,我们可以自行自由发挥的.
参 数 信 息 | 说 明 |
---|---|
daily | 每天轮替 |
weekly | 每周轮替 |
monthly | 每月轮替 |
rotate 数字 | 保留日志文件个数 |
compress | 旧日志启用压缩 |
mail address | 轮替时发送邮件提示 |
missingok | 日志不存在忽略警告 |
notifempty | 日志为空不进行轮替 |
minsize 大小 | 日志轮替最小值 |
size 大小 | 多大进行轮替 |
dateext | 使用日期格式后缀 secure-20181010 |
系统自动定期进行日志轮替的原因:
1./etc/cron.daily/有一个脚本,每天都会运行,查看是否有符合轮替的日志,然后进行相应处理
2.我们尝试在rsyslog配置文件中添加自己的日志记录,然后并且强制执行轮替,看会不会产生轮替文件
3.先在配置文件中写入自己的日志轮替规则
4.强制执行日志轮替logrotate –vf /etc/logrotate.conf
参考文献:Linux鸟哥私房菜,Linux运维之道