当你的 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

打印相关的信息

mail

只要与邮件有关的信息都记录在这里

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运维之道

版权声明:本博客文章与代码均为学习时整理的笔记,文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!