日志概述:

  • 进程和操作系统内核需能够为发生的事件记录日志

  • 志内容可用于系统审计和故障排除

  • 默认日志存储在 /var/log 目录中

  • RHEL7的日志系统由systemd-journald和 rsyslog 两服务组成

 

RHEL7日志存储方式:

  • 在RHEL7中,所有进程都是由systemd产生,所以,systemd也可以获取到所有进程启动或结束过程中产生的日志。systemd有自己的日志管理功能:systemd-journald.service。

  • 当 systemd 启动后,systemd-journald 也会立即启动。将日志存入RAM中,当rsyslog 启动后会读取该RAM并完成筛选分类写入目录 /var/log

 

1、rsyslog

服务:rsyslog.service

  • rsyslog记录的日志大多和服务有关、安全、日常信息的日志,存放在/var/log目录下,把相应的记录放到对应的文件

 

1.1、配置文件

/etc/rsyslog.conf

−定义了:什么服务的什么等级日志记录到哪里

 

vim /etc/rsyslog.conf

#除了mail,authpriv,cron,其它所有的类型的日志都记录到/var/log/messages这个文件中

*.info;mail.none;authpriv.none;cron.none /var/log/messages

 

#所有mail相关的日志,都记录到/var/log/maillog文件中

#-,表示异步存储,因为邮件信息太多,所以,存储到磁盘上时,先缓存到内存,到达一定量,再往磁盘写,提高性能

mail.* -/var/log/maillog

 

1.2、日志目录

根据上面的配置文件,可以发现,默认,所有日志都记录在:/var/log

 

  • boot.log,开机的时候,内核会去检测硬件,然后加载内核功能模块等,这个过程都会记录在这个日志文件里,但是会覆盖上次的记录

  • cron,计划任务的日志

  • dmesg,开机时候,内核检测硬件产生的日志

  • lastlog,记录系统上所有账号最近一次登陆的信息

  • mail,邮件日志

  • messages,几乎系统发生的错误信息都会记录在这个文件中

  • secure,只要和验证(输入账号密码)相关的日志都记录在这个文件,包括su,sudo,ssh,telnet

  • wtmp或faillog,登陆时的正解或错误信息

 

注意:

  • 日志文件内容,千万不要手动修改,如果修改了,rsyslog就不会再往该文件写入内容

 

1.3、配置语法

服务名称.[=!]等级 路径

 

  • .表示大于等于后面的等级

  • .=表示完全等于后面的等级,其它不记录

  • .!表示取反,大于等于指定的等级不记录,也就是只记录小于指定的等级

 

注意:

  • 如果将多个服务记录到同一个文件,用分号(;)隔开

 

vim /etc/rsyslog.conf

#将mail服务的info等级以上的日志都记录到/var/log/mail_info这个文件中

mail.info /var/log/mail_info

 

#只记录mail服务的info日志

mail.=info /var/log/mail1

 

#将mail服务,除了info级别以上的日志,其它都记录

mail.!info /var/log/mail2

 

#除了info级别,其它级别都记录

mail.!=info /var/log/mail3

 

#将mail和ftp两个服务的info以上等级日志,都记录到同一个文件 

#除了mail的日志,其它服务的日志都记录到同一个文件

mail.info;ftp.info /var/log/tt

 

1.4、服务类型

系统默认已经定义了一些服务类型,没有定义的,可以用local自定义

序号

服务类型

说明

0

kern

内核产生的信息,大部分是硬件检测及内核功能的启用信息

1

user

用户级别产生的信息,比如,用户使用的某个命令干了什么事

2

mail

邮件相关的信息

3

daemon

系统服务产生的信息

4

auth

认证/授权相关的信息

5

syslog

rsyslog本身产生的信息

6

lpr

打印相关的信息

7

news

新闻服务器相关的信息

8

uucp

unix to unix copy protocol,早期用于unix系统间的程序数据交换

9

cron

cron/at等计划任务类的信息

10

authpriv

与auth类似,更偏向记录账号私人的信息,包括pam模块的运作等

11

ftp

ftp相关的信息

16-23

local0-local7

保留给用户自定义使用的

 

 

1.5、日志等级

同一个服务所产生的日志,也是有差别,按等级分为0-7,共8个级别

  • 1-3级别的日志,系统已经很危险了

  • 4-7级别的日志,还不会影响系统正常工作

等级

名称

说明

7

debug

debug(排错)时产生的信息

6

info

基本的信息说明

5

notice

注意信息,属正常信息,但比info严重一些

4

warning

警告信息,表示可能有问题,但还不至于影响到守护进程的运行。

3

error

错误信息,表示已经影响到进程的运行了。比如,某服务的配置文件配置错误,造成服务启动不起来

2

crit

临界点,比error还严重的错误信息,表示这个错误已经很严重了

1

alert

报警,比crit还严重

0

emerg/panic

疼痛级别,最严重的错误信息,表示系统都要宕机了。通常是硬件问题,造成内核无法正常工作,就会出现这种等级的信息

 

 

1.6、日志格式

cat /var/log/mesage

−日志以空格分段

−1-3,时间日期

−4,主机名

−5,服务名

−6及之后,具体事件

 

2、日志的轮替

比如:ls /var/log/message*,可能看到有几个文件

 

轮替规则:

  • 比如:一个月轮替一次,messages记录一个月的日志,下个月就把这个文件mv成messages20160522,然后新生成一个新的messages文件,这样就是一个月一个文件

  • 保持日志规划:保持多少份旧日志

  • 日志的大小轮替:根据日志文件的大小,考虑要不要做轮替

 

2.1、谁在做轮替?

#cron.daily这个目录表示每天会去执行这个目录下的文件里面的命令,虽然每天会执行轮替命令,只有达到规则的才轮替,比如大小,如果日志文件没有达到规则指定大小,就不轮替

cat /etc/cron.daily/logrotate   

/usr/bin/logger -t  logrotate******

 

2.2、轮替命令

#根据配置文件,进行轮替

logrotate -vf /etc/logrotate.conf  

−-v,显示过程

−-f,强制执行,不论是否符合设定,强制进行轮替,比如,根据设定,轮替时间还没到,不管,一样执行

 

2.3、配置文件

vim /etc/logrotate.conf

#每周执行一次rotate

weekly

 

#保留4份

rotate 4

 

#由于旧日志文件已经被改名,新建一个空文件

create

 

#设定将旧日志文件改名时加上日期

dateext

 

#对轮替的文件进行压缩

comperss

 

注意:上面的规则针对所有的日志文件有效,

 

#针对/var/log/wtmp的设置

/var/log/wtmp {

#每月执行一次,替代前面的每周

monthly

 

#指定新建的文件权限及所属用户、组

create 0664 root utmp

 

#指定只当文件超过1M才做rotate,即使时间到了

minsize 1M

 

#保留一个旧文件

rotate 1

}

 

3、journal

3.1、rsyslog的问题

  • 过去只有rsyslog的时候,rsyslog必须要在开机完成,并且启动了守护进程之后,才会开始记录日志。这样,开机过程中及其它服务启动的日志,rsyslog就没办法记录。于是,内核自己产生一个klogd的服务,来记录开机过程、服务启动过程中的日志信息,然后等rsyslog启动之后,再传给它处理。

 

3.2、journal的问题

  • 有了systemd之后,由于它是内核启动的第一个进程,它主动呼叫journal来记录日志,因此开机过程中的日志,以及服务启动时的日志,都可以被journal记录

  • 但是,journal也有问题,它将日志都记录在内存中,所以还需要rsyslog协助来将日志分类写到磁盘文件中。

 

3.3、查看日志

  • journal记录的是系统的报错信息,或服务启动的时候的日志,存放在内存中,映射目录:/run/log/journal

  • /run/log/jounal/ 这个目录下的文件是内存文件,只可用journalctl命令查看

 

#查看后5行

journalctl -n 5 

 

#动态查看

journalctl -f 

 

#指定错误级别日志

journalctl -p err|info|debug 

 

#查看2016年1月1日到2016年3月1日的日志,注意journal日志,关机就没了,所以注意时间

journalctl --since “2016-01-01 00:00:00” \

--until “2016-03-01 00:00:00” 

 

3.4、保存journal日志

  • 如果比较喜欢journal日志的格式,可以将它保存到磁盘中。

  • journal默认就配好了,将自己的日志保存到/var/log/journal这个目录中,我们要做的,就是创建这个目录,并设置好权限即可

  • 如果想自定义,可改配置文件:/etc/systemd/journald.conf

 

mkdir -m 2755 /var/log/journal

chown root:systemd-journal /var/log/journal

systemctl restart systemd-journald.service

 

注意:

  • 随着时间的增长,日志文件会越来越大

  • 已经有rsyslog在保存日志,所以,没必要再保存一份

 

4、日志服务器

  • 将所有服务器的日志,统一到一台服务器,进行集中存储

  • rsyslog本身支持集中存储功能,只不过默认没有开启

 

一个完整的集中式日志系统,是离不开以下几个主要特点的。

  • 收集,能够采集多种来源的日志数据

  • 传输,能够稳定的把日志数据传输到中央系统

  • 存储,如何存储日志数据

  • 分析,可以支持 UI 分析

  • 警告,能够提供错误报告,监控机制

 

解决方案:ELK

ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana。

  • Elasticsearch是搜索引擎

  • Logstash是日志收集工具

  • Kibana是日志展示工具

 

4.1、服务器配置

vim /etc/rsyslog.conf

#启用UDP的514端口

#$ModLoad imudp

#$UDPServerRun 514 

 

#启用TCP

$ModLoad imtcp

$InputTCPServerRun 514 

 

注意,只选择其中一个

 

#自定义一个模板,在/data/log目录下,为每台主机创建一个目录,然后按日志类型,创建对应文件

$template RemoteHost,"/data/log/%HOSTNAME%/%syslogfacility-text%.log"

−HOSTNAME,表示主机名

−syslogfacility-text,日志类型名称

 

#所有日志存储,都使用上面定义的模板

*.* ?RemoteHost

 

#丢弃,表示后面定义的内容丢弃,不使用

& ~

 

#重启服务

systemctl restart rsyslog

 

模板定义语法:

$template <name>,<内容>,<可选项>

 

内置变量:

https://www.rsyslog.com/doc/v5-stable/configuration/properties.html

 

4.2、客户端配置

将本地日志保存一份到日志服务器

 

vim /etc/rsyslog.conf

#TCP配置

*.* @@10.0.0.1:514

 

#UDP配置

#*.* @10.0.0.1:514

 

systemctl restart rsyslog

 

注意:

  • 以上设置,在本地还会保留一份,建议操作

  • 如果不想在本地保留,可将上述配置放到所有规则的最前面,然后加上& ~

 

5、时间同步

  • 时区,过去世界各地自定当地时间,但随着交通和电讯的发达,各地交流日益频繁,所以就需要一个全球性的标准时间,全球划分为24个时区,规定以英国格林威治天文台旧址为0时区(也叫中时区),分东西时区,东12区,以+表示,西12区,以-表示。比如:中国处于东8区,就以UTC+8表示。

  • GMT,格林威治时间,现在已经不再作为标准时间使用,是指位于伦敦郊区的皇家格林威治天文台的时间为标准,每个相邻时区之间相差一个小时,但由于地球自转不是一个规则的圆,造成时区间的误差较大。比如:东12区看到日出的时间是6:00,而到了西12区,可能看到日出的时间就是6:15。

  • UTC,世界统一时间,还是以格林威治时间为标准,但由原子钟计算每个时区的时间,比GMT时间更精准,误差在0.9秒以内

 

注意:

  • CST,只是一个时区的缩写,共代表4个时区,不仅仅代表中国标准时间。

  • central standard time(USA) UT-6:00 美国中部时间

  • central standard time (australia) UT+9:30 澳大利亚中部时间

  • china standard time UT+8:00 中国标准时间

  • cuba standard time UT-4:00  古巴标准时间

 

    系统时间:系统启动时,内核会去BIOS取时间,然后自己维护,由linux内核通过CPU的工作频率进行计时。

    硬件时间:指的是BIOS的时间。

    如果系统时间和硬件时间不一致,需要作同步

 

#查看硬件时间

hwclock -r 

 

#用系统时间同步硬件时间

hwclock -w 

 

#用硬件时间同步系统时间

hwcolck -s 

 

5.1、date命令

参数:

  • %H 小时(以00-23来表示)

  • %M 分钟(以00-59来表示)

  • %s  总秒数,以1970-01-01 00:00:00时间算起到目前的秒数

  • %S 秒(本地时间的秒)

  • %D 日期(包含年月日)

  • %Y 年(以四位数来表示)

  • %y 年(以后两位数来表示)

  • %m 月(以01-12来表示)

  • %d 日(以01-31来表示)

 

5.2、date查看、设置本地时间

#查看当前系统时间

date

 

#显示全部日期

date +%F

 

#显示全部时间

date +%T

 

#以自定义格式输出当前时间

date "+%Y-%m-%d %H:%M:%S"

 

#设置当前时间,只有root权限才能设置,其他只能查看

date -s

 

#将当前日期设置成20080523,这样会把具体时间设置成空00:00:00

date -s 20080523

 

#设置具体时间,不会对日期作更改

date -s 01:01:01

 

#设置全部时间

date -s “01:01:01 2008-05-23”

 

#设置全部时间

date -s “01:01:01 20080523”

 

#设置全部时间

date -s “2008-05-23 01:01:01”

 

#设置全部时间

date -s “20080523 01:01:01”

 

5.3、设置硬件时间

  • 硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间,然后系统时钟就会独立于硬件运作(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。

 

#查看硬件时间,也就是主板时间

hwclock

 

#从硬件时间设置系统时间

hwclock -s

 

#从系统时间设置硬件时间

hwclock -w

 

5.4、timedatectl命令

#查看当前系统时间的详细信息

timedatectl

 

#设置系统时间

timedatectl set-time “2008-05-23 01:01:01”

 

#列出时区

timedatectl list-timezones 

 

#设置时区

timedatectl set-timezone

 

5.5、NTP服务器

可实现NTP服务器的程序:chrony,ntpd

 

Chrony 的优势:

  • 更快的同步只需要数分钟而非数小时时间,从而最大程度的减少时间和频率误差,这对于并非全天运行的台式计算机或系统而言非常有用。

  • 能够更好的响应时间频率的快速变化,这对于具备不稳定时钟的虚拟机或导致时钟频率反生变化的节能技术而言非常有用。

  • 在初始同步后,它并不会停止时钟,以防对需要系统时间保持单调的程序造成影响。

  • 在应对临时非对称延迟时,(例如,大规模下载造成链接饱和时)提供了更好的稳定性。

  • 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。

 

yum install -y chrony

 

vi /etc/chrony.conf

#指定上游时间服务器

server time1.aliyun.com iburst

server time2.aliyun.com iburst

−server,后面指定你的时间服务器地址

−iburst,当server不可达时,以默认发包速率的8倍向服务器发包,对首次同步有利,尽快同步

 

#允许哪些客户端来同步时间,也就是作为服务器来使用

allow 172.25.254.0/24

 

systemctl restart chronyd

 

5.6、chrony客户端

chrony客户端自动去和时间服务器进行时间同步

 

yum install -y chrony

 

#编辑配置文件

vi /etc/chrony.conf

#指定时间服务器是谁

server 172.25.254.10 iburst

 

#重启服务

systemctl restart chronyd.service

 

#查看

chronyc sources -v

−M表示mode,^表示是server

−S表示state,*表示当前同步的时间服务器

−stratum,表示层级,比如:国家时间服务器为层1,我们自己的服务器连到层1同步时间,并且也对外提供时间服务,那么,我们自己服务器就是层2

−poll,轮询时间,以2为基数的幂次方,时间为秒,比如:设置为6,表示每64秒同步一次时间

−lastRx,表示最后一次从源收到同步消息,到当前的时间

−last sample,表示最后一次收到的时间样本,和本地时间的偏移量。中括号内为偏移量,+/-指示符后面的数字表示测量中的误差范围

 

#手动同步

ntpdate 192.168.1.254