Linux 系统日志分析与管理

Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去,完成这个过程的程序就是syslog,syslog可以根据日志的类别和优先级将日志保存到不同的文件中.

关于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

posted @ 2019-01-04 18:34  lyshark  阅读(810)  评论(0编辑  收藏  举报

loading... | loading...
博客园 - 开发者的网上家园