Linux系统学习系列——Linux系统日志管 理(上)

  1. Linux rsyslogd服务及启动方法(详解版)

在 CentOS 6.x 中,日志服务已经由 rsyslogd 取代了原先的 syslogd。Red Hat 公司认为 syslogd 已经不能满足工作中的需求,rsyslogd 相比 syslogd 具有一些新的特点:

  • 基于TCP网络协议传输日志信息。
  • 更安全的网络传输方式。
  • 有日志信息的即时分析框架。
  • 后台数据库。
  • 在配置文件中可以写简单的逻辑判断。
  • 与syslog配置文件相兼容。

rsyslogd 日志服务更加先进,功能更多。但是,不论是该服务的使用,还是日志文件的格式,其实都是和 syslogd 服务相兼容的,所以学习起来基本和 syslogd 服务一致。

我们如何知道 Linux 中的 rsyslogd 服务是否启动了呢?如何查询 rsyslogd 服务的自启动状态呢?命令如下:

[root@localhost ~]# ps aux | grep "rsyslog" | grep -v "grep"
root 1139 0.0 0.2 35948 1500 ? Sl 09:40 0:00 /sbin/rsyslogd -i/var/run/syslogd.pid -c 5
#有rsyslogd服务的进程,所以这个服务已经启动了
[root@localhost ~]# chkconfig --list | grep rsyslog
rsyslog 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
#rsyslog服务在2、3、4、5运行级别上是开机自启动的 

系统中的绝大多数日志文件是由 rsyslogd 服务来统一管理的,只要各个进程将信息给予这个服务,它就会自动地把日志按照特定的格式记录到不同的日志文件中。也就是说,采用 rsyslogd 服务管理的日志文件,它们的格式应该是统一的。

在 Linux 系统中有一部分日志不是由 rsyslogd 服务来管理的,比如 apache 服务,它的日志是由 Apache 软件自己产生并记录的,并没有调用 rsyslogd 服务。但是为了便于读取,apache 日志文件的格式和系统默认日志的格式是一致的。
Linux系统学习系列——Linux系统日志管 理(上)_第1张图片

需要Linux资料以及Linux入门资料+qun832218493获取

2.Linux日志文件(常见)及其功能

日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。这些信息有些非常敏感,所以在 Linux 中这些日志文件只有 root 用户可以读取。

那么,系统日志文件保存在什么地方呢?还记得 /var/ 目录吗?它是用来保存系统动态数据的目录,那么 /var/log/ 目录就是系统日志文件的保存位置。我们通过表 1 来说明一下系统中的重要日志文件。

Linux系统学习系列——Linux系统日志管 理(上)_第2张图片

除系统默认的日志之外,采用 RPM 包方式安装的系统服务也会默认把日志记录在 /var/log/ 目录中(源码包安装的服务日志存放在源码包指定的目录中)。不过这些日志不是由 rsyslogd 服务来记录和管理的,而是各个服务使用自己的日志管理文档来记录自身的日志。以下介绍的日志目录在你的 Linux 上不一定存在,只有安装了相应的服务,日志才会出现。服务日志如表 2 所示。

Linux系统学习系列——Linux系统日志管 理(上)_第3张图片

3.Linux日志文件格式分析

只要是由日志服务 rsyslogd 记录的日志文件,它们的格式就都是一样的。所以我们只要了解了日志文件的格式,就可以很轻松地看懂日志文件。

日志文件的格式包含以下 4 列:

  • 事件产生的时间。
  • 产生事件的服务器的主机名。
  • 产生事件的服务名或程序名。
  • 事件的具体信息。

我们查看一下 /var/log/secure 日志,这个日志中主要记录的是用户验证和授权方面的信息,更加容易理解。命令如下:

[root@localhost ~]# vi /var/log/secure
Jun 5 03:20:46 localhost sshd[1630]:Accepted password for root from 192.168.0.104 port 4229 ssh2
# 6月5日 03:20:46 本地主机 sshd服务产生消息:接收从192.168.0.104主机的4229端口发起的ssh连接的密码
Jun 5 03:20:46 localhost sshd[1630]:pam_unix(sshd:session):session opened for user root by (uid=0)
#时间 本地主机 sshd服务中pam_unix模块产生消息:打开用户root的会话(UID为0)
Jun 5 03:25:04 localhost useradd[1661]:new group:name=bb, GID=501
#时间 本地主机 useradd命令产生消息:新建立bb组,GID为501
Jun 5 03:25:04 localhost useradd[1661]:new user:name=bb, UID=501, GID=501, home=/home/bb, shell=/bin/bash
Jun 5 03:25:09 localhost passwd:pam_unix(passwd:chauthtok):password changed for bb 

我截取了一段日志的内容,注释了其中的三句日志,剩余的两句日志大家可以看懂了吗?其实分析日志既是重要的系统维护工作,也是一项非常枯燥和烦琐的工作。如果我们的服务器出现了一些问题,比如系统不正常重启或关机、用户非正常登录、服务无法正常使用等,则都应该先查询日志。

实际上,只要感觉到服务器不是很正常就应该查看日志,甚至在服务器没有什么问题时也要养成定时查看系统日志的习惯。

4.rsyslogd配置文件格式及其内容详解

rsyslogd 服务是依赖其配置文件 /etc/rsyslog.conf 来确定哪个服务的什么等级的日志信息会被记录在哪个位置的。也就是说,日志服务的配置文件中主要定义了服务的名称、日志等级和日志记录位置。

/etc/rsyslog.conf配置文件的格式

该配置文件的基本格式如下所示:

authpriv.* /var/log/secure
#服务名称[连接符号]日志等级 日志记录位置
#认证相关服务.所有日志等级 记录在/var/log/secure日志中 
服务名称

我们首先需要确定 rsyslogd 服务可以识别哪些服务的日志,也可以理解为以下这些服务委托 rsyslogd 服务来代为管理日志。这些服务如表 1 所示。

Linux系统学习系列——Linux系统日志管 理(上)_第4张图片

这些日志服务名称是rsyslogd服务自己定义的,并不是实际的Linux的服务。当有服务需要由rsyslogd服务来帮助管理日志时,只需要调用这些服务名称就可以实现日志的委托管理。

这些日志服务名称大家可以使用命令“man 3 syslog”来查看。虽然我们的日志管理服务已经更新到rsyslogd,但是很多配置依然沿用了syslogd服务,在帮助文档中仍然查看syslog服务的帮助信息。

连接符号

日志服务连接日志等级的格式如下:

日志服务[连接符号]日志等级 日志记录位置 

在这里,连接符号可以被识别为以下三种。

  1. “.”代表只要比后面的等级高的(包含该等级)日志都记录。比如,“cron.info”代表cron服务产生的日志,只要日志等级大于等于info级别,就记录。
  2. “.=”代表只记录所需等级的日志,其他等级的日志都不记录。比如,“*.=emerg”代表人和日志服务产生的日志,只要等级是emerg等级,就记录。这种用法极少见,了解就好。
  3. “.!”代表不等于,也就是除该等级的日志外,其他等级的日志都记录。
日志等级

每个日志的重要性都是有差别的,比如,有些日志只是系统的一个日常提醒,看不看根本不会对系统的运行产生影响;但是有些日志就是系统和服务的警告甚至报错信息,这些日志如果不处理,就会威胁系统的稳定或安全。如果把这些日志全部写入一个文件,那么很有可能因为管理员的大意而忽略重要信息。

比如,我们在工作中需要处理大量的邮件,笔者每天可能会接收到200多封邮件。而这些邮件中的绝大多数是不需要处理的普通信息邮件,甚至是垃圾邮件。所以笔者每天都要先把这些大量的非重要邮件删除之后,才能找到真正需要处理的邮件。但是每封邮件的标题都差不多,有时会误删除需要处理的邮件。这时笔者就非常怀念Linux的日志等级,如果邮件也能标识重要等级,就不会误删除或漏处理重要邮件了。

邮件的等级信息也可以使用“man 3 syslog”命令来查看。日志等级如表 2 所示,我们按照严重等级从低到高排列。

Linux系统学习系列——Linux系统日志管 理(上)_第5张图片

日志等级还可以被识别为“none”。如果日志等级是none,就说明忽略这个日志服务,该服务的所有日志都不再记录。

日志记录位置

日志记录位置就是当前日志输出到哪个日志文件中保存,当然也可以把日志输出到打印机打印,或者输出到远程日志服务器上(当然,远程日志服务器要允许接收才行)。日志的记录位置也是固定的:

  • 日志文件的绝对路径。这是最常见的日志保存方法,如“/var/log/secure”就是用来保存系统验证和授权信息日志的。
  • 系统设备文件。如“/dev/lp0”代表第一台打印机,如果日志保存位置是打印机设备,当有日志时就会在打印机上打印。
  • 转发给远程主机。因为可以选择使用 TCP 和 UDP 协议传输日志信息,所以有两种发送格式:如果使用“@192.168.0.210:514”,就会把日志内容使用 UDP 协议发送到192.168.0.210 的 UDP 514 端口上;如果使用“@@192.168.0.210:514”,就会把日志内容使用 TCP 协议发送到 192.168.0.210 的 TCP 514 端口上,其中 514 是日志服务默认端口。当然,只要 192.168.0.210 同意接收此日志,就可以把日志内容保存在日志服务器上。
  • 用户名。如果是“root”,就会把日志发送给 root 用户,当然 root 要在线,否则就收不到日志信息了。发送日志给用户时,可以使用“”代表发送给所有在线用户,如“mail.*”就会把 mail 服务产生的所有级别的日志发送给所有在线用户。如果需要把日志发送给多个在线用户,则用户名之间用“,”分隔。
  • 忽略或丢弃日志。如果接收日志的对象是“~”,则代表这个日志不会被记录,而被直接丢弃。如“local3.* ~”代表忽略 local3 服务类型所有的日志都不记录。
  • 忽略或丢弃日志。如果接收日志的对象是“~”,则代表这个日志不会被记录,而被直接丢弃。如“local3.* ~”代表忽略 local3 服务类型所有的日志都不记录。

/etc/rsyslog.conf配置文件的内容

我们知道了/etc/rsyslog.conf 配置文件中日志的格式,接下来就看看这个配置文件的具体内容。

[root@localhost ~]# vi /etc/rsyslog.conf
#查看配置文件的内容
#rsyslog v5 configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
*### MODULES ###
#加载棋块
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
#加载imixsock模块,为本地系统登录提供支持
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
#加载imklog模块,为内核登录提供支持
#$ModLoad immark # provides --MARK-- message capability
#加载immark模块,提供标记信息的能力
# Provides UDP syslog reception
#$ModLoad imudp
#SUDPServerRun 514
#加载UPD模块,允许使用UDP的514端口接收采用UDP协议转发的日志
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
#加栽TCP摸块,允许使用TCP的514编口接收采用TCP协议转发的日志
#### GLOBAL DIRECTIVES ####
#定义全局设置
#Use default timestamp format
#ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #定义曰志的时间使用默认的时间戳格式
#File syncing capability is disabled by default. This feature is usually not required,
#not useful and an extreme performance hit
#$ActionFileEnableSync on
#文件同步功能。默认没有开启,是注释的
#Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
#包含/etx/tsyslog.d/目录中所有的".conf"子配置文件。也就是说,这个目录中的所有子配置文件也同时生效
#### RULES ####
#日志文件保存规则
#Log all kernel messages to the console.
#Logging much else clutters up the screen.
#kern.* /dev/console
#kern服务.所有曰志级别 保存在/dev/console
#这个日志默认没有开启,如果需要,则取消注释
#Log anything (except mail) of level info or higher.
#Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
#所有服务.info以上级到的日志保存在/var/log/messages日志文件中
#mail, authpriv^ cron的B志不记录在/var/log/messages曰志文件中,因为它们部有自己的曰志文件
#所以/var/log/messages日志是最重要的系统日志文件,需要经常查看
#The authpriv file has restricted access.
authpriv.* /var/log/secure
#用户认证服务所有级别的日志保存在/vai/1og/secure日志文件中
#Log all the mail messages in one place.
mail.* -/var/log/maillog
#mail服务的所有级别的日志保存在/var/log/maillog 日志文件中
#"-"的含义是日志先在内存中保存.当曰志足够多之后.再向文件中保存
# Log cron stuff
cron.* /var/log/cron
#计対任务的所有日志保存在/var/log/cron日志文件中
# Everybody gets emergency messages
#所有日志服务的疼痛等级日志对所有在线用户广播
#Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler
#uucp和news曰志服务的crit以上级别的日志保存在/var/log/sppoler曰志文件中
#Save boot messages also to boot.log
local7.* /var/log/boot.log
#loacl7 日志服务的所有日志写入/var/log/boot.log 日志文件中 #会把开机时的检测信息在显示到屏幕的同时写入/var/log/boot.log 日志文件中
# ### begin forwarding rule ###
#定义转发规到
#The statement between the begin ... end define a SINGLE forwarding
#rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again. #SWorkDirectory /var/lib/rsyslog # where to place spool files #$ActionQueueFileName fwdRulel # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList t run asynchronously
#$ActionResumeRetryCount -1 # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional #*•* @6remote-host:514
# ### end of the forwarding rule ## 

其实系统已经非常完善地定义了这个配置文件的内容,系统中重要的日志也已经记录得非常完备。如果是外来的服务,如 apache、Samba 等服务,那么这些服务的配置文件中也详细定义了日志的记录格式和记录方法。所以,日志的配置文件基本上不需要我们修改,我们要做的仅仅是查看和分析系统记录好的日志而已。

5.Linux日志服务器设置过程

我们知道,使用“@IP:端口”或“@@IP:端口”的格式可以把日志发送到远程主机上,那么这么做有什么意义吗?

假设我需要管理几十台服务器,那么我每天的重要工作就是查看这些服务器的日志,可是每台服务器单独登录,并且查看日志非常烦琐,我可以把几十台服务器的日志集中到一台日志服务器上吗?这样我每天只要登录这台日志服务器,就可以查看所有服务器的日志,要方便得多。

如何实现日志服务器的功能呢?其实并不难,不过我们首先需要分清服务器端和客户端。假设服务器端的服务器 IP 地址是 192.168.0.210,主机名是 localhost.localdomain;客户端的服务器 IP 地址是 192.168.0.211,主机名是 www1。我们现在要做的是把 192.168.0.211 的日志保存在 192.168.0.210 这台服务器上。实验过程如下:

#服务器端设定(192.168.0.210):
[root@localhost ~]# vi /etc/rsyslog.conf
…省略部分输出…
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
#取消这两句话的注释,允许服务器使用TCP 514端口接收日志
…省略部分输出…
[root@localhost ~]# service rsyslog restart
#重启rsyslog日志服务
[root@localhost ~]# netstat -tlun | grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
#查看514端口已经打开
#客户端设置(192.168.0.211):
[root@www1 ~]# vi /etc/rsyslog.conf
#修改日志服务配置文件
*.* @@192.168.0.210:514
#把所有日志采用TCP协议发送到192.168.0.210的514端口上
[root@www1 ~]# service rsyslog restart
#重启日志服务 

这样日志服务器和客户端就搭建完成了,以后 192.168.0.211 这台客户机上所产生的所有日志都会记录到 192.168.0.210 上。比如:

#在客户机上(192.168.0.211)
[root@wwwl ~]# useradd zhangsan
#添加zhansan用户提示符的主机名是www1)
#在限务器(192.168.0.210)上
[root@localhost ~]# vi /var/log/secure
#査看服务器的secure日志(注意:主机名是localhost)
Aug 8 23:00:57 wwwl sshd【1408]: Server listening on 0.0.0.0 port 22.
Aug 8 23:00:57 wwwl sshd[1408]: Server listening on :: port 22.
Aug 8 23:01:58 wwwl sshd[1630]: Accepted password for root from 192.168.0.101 port 7036 ssh2
Aug 8 23:01:58 wwwl sshd[1630]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 8 23:03:03 wwwl useradd[1654]: new group: name=zhangsan, GID-505
Aug 8 23:03:03 wwwl useradd[1654]: new user: name=zhangsan, UXD=505, GID=505,
home=/home/zhangsan, shell=/bin/bash
Aug 8 23:03:09 wwwl passwd: pam_unix(passwd:chauthtok): password changed for zhangsan
#注意:查看到的日志内容的主机名是www1,说明我们虽然查看的是服务器的日志文件,但是在其中可以看到客户机的日志内容 

需要注意的是,日志服务是通过主机名来区别不同的服务器的。所以,如果我们配置了日志服务,则需要给所有的服务器分配不同的主机名。

你可能感兴趣的:(c++,linux,服务器开发,架构师,c)