Rsyslog系统日志管理
课程目标
- 了解日志的级别与作用
- 掌握 rsyslog 服务的本地日志和远程日志的管理
- 能够使用 logrotate 程序根据需求对日志进行轮转
一、常见的系统日志
日志格式:文本日志/二进制日志/数据库日志
默认的相关日志文件:
/var/log/boot.log 系统引导日志,记录开机启动信息
/var/log/dmesg 核心的启动日志
/var/log/message 系统的日志文件
/var/log/maillog 邮件服务的日志
/var/log/xferlog ftp服务的日志
/var/log/secure 网络连接及系统登录的安全信息
/var/log/cron 定时任务的日志
/var/log/wtmp 记录所有的登入和登出 last -f 查看
/var/log/btmp 记录失败的登入尝试
二、日志管理程序
- 在RHEL6中,syslogd已经被rsyslog取代,它可以将日志写入数据库,并可以利用模板和插件控制输入输出。
- rsyslog程序管理本地和远程日志
- 安装软件
- 根据需求修改配置文件
- 启动服务
- 测试验证
三、日志级别
# man syslog
日志信息分为以下级别,从上到下级别一次降低
none none不是一个等级,它表示不记录服务的所有信息
0 emerg 系统不可用
1 alert 特别留意的报警信息
2 crit 非常严重的状况
3 err 错误信息
4 warning 警告信息
5 notice 稍微需要注意的信息
6 info 正常信息
7 debug 调试信息,开发人员使用
四、日志配置
[root@server ~]# rpm -q rsyslog
rsyslog-5.8.10-8.el6.x86_64
[root@server ~]# rpm -ql rsyslog
/etc/logrotate.d/syslog
/etc/pki/rsyslog
/etc/rc.d/init.d/rsyslog //启动脚本
/etc/rsyslog.conf //主配置文件
/etc/rsyslog.d //子配置文件
/etc/sysconfig/rsyslog
/sbin/rsyslogd
/usr/share/man/man5/rsyslog.conf.5.gz
/usr/share/man/man8/rsyslogd.8.gz
[root@server ~]# grep -v ^# /etc/rsyslog.conf
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
$template SpiceTmpl,"%TIMESTAMP%.%TIMESTAMP:::date-subseconds% %syslogtag% %syslogseverity-text%:%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%
"
:programname, startswith, "spice-vdagent" /var/log/spice-vdagent.log;SpiceTmpl
1.日志定义相关符号
配置文件中常见的表示符合
. 用来分隔服务和级别
* 任何服务,或者任何级别
= 有等号表示等于某一级别,没有等号表示大于或者等于某一级别
! 排除操作,前面有相同服务的表达式,这个操作才有意义
代表从前面表达式所包含的内容中排除某些内容
; 用于分隔不同的 服务,级别,组合
, 用于分隔不同服务
- 用于指定目标文件时,代表异步写入
举例说明
mail.=info
mail.info mail服务大于等于info级别的日志
mail.info;cron.=info /var/log/test.log
mail,cron.err
cron.=warning
mail,cron.info
cron.info;cron.!=err 012456
0123456 0124567
cron.info;cron.!err 456
0123456 4567
特别说明:
The facility is one of the following keywords: auth,
authpriv, cron, daemon, kern, lpr, mail, mark, news,
security (same as auth), syslog, user, uucp and
local0 through local7.(设备载体)
log facility 设备 设施:用来记录一种类型日志的日志设备
daemon
auth
authpriv
user
mail
lpr
news
uucp
ftp
local7
本地日志管理ssh
[root@server ~]# man sshd_config
SyslogFacility
Gives the facility code that is used when logging
messages from sshd(8). The possible values are: DAE-
MON, USER, AUTH, AUTHPRIV, LOCAL0, LOCAL1, LOCAL2,
LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. The default
is AUTH.
- 更改ssh服务的默认日志记录载体
- 通过rsyslog程序去管理来自指定设备载体的日志记录到指定的文件(修改/etc/rsyslog.conf)
- 测试验证
1.修改ssh服务配置文件
[root@server ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
[root@server ~]# vim /etc/ssh/sshd_config
SyslogFacility LOCAL6
2.重启服务
[root@server ~]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
3.将来自LOCAL6设备载体日志记录指定位置(rsyslog)
[root@server ~]# vim /etc/rsyslog.conf
local6.* /var/log/ssh
4.重启rsyslog服务
[root@server ~]# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
5.客户端测试
[root@client ~]# ssh 10.1.1.2
Last login: Fri Apr 26 12:27:33 2019 from 10.1.1.1
[root@server log]# ll ssh
-rw------- 1 root root 0 Apr 26 13:40 ssh
[root@server log]# tail -f ssh
Apr 26 13:42:09 server sshd[2447]: Accepted publickey for root from 10.1.1.3 port 35951 ssh2
Apr 26 13:44:10 server sshd[2447]: Received disconnect from 10.1.1.3: 11: disconnected by user
此时进行ssh访问,日志会在local6和/var/log/messages里都出现
如果不想记录到/messages,可修改/etc/rsyslog.conf,添加local6.none,则不再显示ssh的日志
*.info;mail.none;authpriv.none;cron.none;local6.none /var/log/messages
五、远程日志管理
目前:把多台服务器的日志远程记录到其中一台日志服务器集中化管理,方便对其统一分析和管理
环境:
log-server:10.1.1.2
应用服务器:10.1.1.3
ssh服务服务——>其他人远程访问该应用服务器产生ssh服务日志——>远程记录到log-server上
client:10.1.1.4
ssh:10.1.1.3——>日志记录10.1.1.2
需求:把web服务器上的ssh服务日志,远程记录到log-server上
思路:
web应用服务器上操作
- 将web服务器上的ssh服务的日志单独记录
- 指定ssh服务的设备载体
- 重启服务
- 将来自于ssh服务的日志设备载体上的日志远程发送到log-server上
以下操作在log-server上操作
- 通过修改配置文件,打开日志传输端口
- 加载相应模块 tcp | udp
- 打开接收端口 默认514端口
- 启动服务后日志默认会保存到/var/log/messages
步骤:
以下操作在log-service(10.1.1.2)服务上完成
1.加载相应模块打开接收端口(可以选择udp、tcp都打开)
[root@log-server ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
2.重启服务
service rsyslog restart
[root@log-server ~]# netstat -nltup |grep 514 //验证端口是否打开
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 2822/rsyslogd
tcp 0 0 :::514 :::* LISTEN 2822/rsyslogd
udp 0 0 0.0.0.0:514 0.0.0.0:* 2822/rsyslogd
udp 0 0 :::514 :::* 2822/rsyslogd
以下操作在应用服务器完成(10.1.1.3):
1.指定ssh服务的日志文件的设备载体
[root@ssh-server ~]# vim /etc/ssh/sshd_config
SyslogFacility LOCAL0
2.重启ssh服务
[root@ssh-server ~]# service sshd restart
3.修改/etc/rsyslog.conf来指定ssh服务的日志发送到远端去
[root@ssh-server ~]# vim /etc/rsyslog.conf
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
local0.* @10.1.1.2:514 //一个@表示udp,两个@表示tcp
最关键的一步,将日志远程发送给10.1.1.2
4.重启rsyslog服务
[root@ssh-server ~]# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
测试验证(client:10.1.1.4)
[root@client ~]# ssh 10.1.1.3
The authenticity of host '10.1.1.3 (10.1.1.3)' can't be established.
RSA key fingerprint is a5:98:06:58:84:35:d3:f4:4c:f8:43:a1:a5:12:f5:8e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.1.3' (RSA) to the list of known hosts.
root@10.1.1.3's password:
Last login: Fri Apr 26 14:46:31 2019 from 10.1.1.1
[root@log-server ~]# tail -f /var/log/messages
Apr 26 15:12:30 ssh-server sshd[2858]: Accepted password for root from 10.1.1.4 port 58561 ssh2
[root@ssh-server ~]# tail -f /var/log/messages
Apr 26 15:12:30 ssh-server sshd[2858]: Accepted password for root from 10.1.1.4 port 58561 ssh2
(不想记录就修改/etc/rsyslog.conf,将local0.none加在/var/log/messages那行里)
注意:selinux和防火墙,还有udp和tcp 端口514是否打开
六、日志轮转
日志轮循(轮转):日志轮转,切割,备份,归档
- 为什么要日志轮转?
- 避免日志过大占满/var/log的文件系统
- 方便日志查看
- 将丢弃系统中最旧的日志文件,以节省空间
- 日志轮转的程序是logrotate
- logrotate本身不是系统守护进程,它是通过计划crond每天执行
- 如何进行日志轮转?
- 了解相关配置文件
[root@log-server ~]# rpm -ql logrotate
/etc/cron.daily/logrotate 周期性计划任务
/etc/logrotate.conf 配置文件
/etc/logrotate.d 子配置文件存放路径
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.7.8
/usr/share/doc/logrotate-3.7.8/CHANGES
/usr/share/doc/logrotate-3.7.8/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
[root@log-server ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs 保留4周备份日志
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file 日期作为后缀给旧文件重命名
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d 加载外部目录
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1 保留1份日志文件,每一个月备份一次日志文件
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
常见的一些参数:
daily 指定转储周期为每天
monthly 指定转储周期为每月
weekly 每周轮转一次
rotate 4 同一个文件最多轮转4次,4次之后就删除该文件
create 0664 root uttmp 轮转之后创建新文件,权限是0664,属于root用户和utmp组
dateext 用日期来做轮转之后的文件的后缀名
compress 用gzip对轮转后的日志进行压缩
minsize 30K 文件必须大于30k,且周期到了,才会轮转
size 30K 文件大于30k才会轮转,不论周期是否已到
missingok 如果日志文件不存在,不报错
notifempty 如果日志文件是空的,不轮转
delaycompress 下一次轮转的时候才压缩
sharedscripts 不管有多少个文件待轮转,prerotate和postrotate代码只执行一次
prerotate 如果符合轮转的条件,则在轮转之前执行prerotate和endscript之间的shell代码
postrotate 轮转完成后执行postrotate和endscript之间的shell代码
[root@server~]# cat /etc/logrotate.d/syslog
这个子配置文件,没有指定的参数都会以默认方式轮转
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts 不管有多少个文件待轮转,prerotate和postrotate代码只执行一次
postrotate 转换完后执行postrotate和endscirpt之间的shell代码
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
轮转后对rsyslog的pid进行刷新(但pid其实不变)
endscript
}
思考:为什么轮转后需要对rsyslog的pid进行刷新?
ll -i 查看文件的inode
-HUP 平滑重启
不以时间为后缀进行轮转,在/etc/logrotate.conf/ nodateext
清空环境
重启服务
结论
后刷新pid的话,logger -t "呵呵" "再见!"会写入旧文件(messages.1)里面
将这句话放在/bin/kill这条命令后面,会写入新文件里
最新的文件是messages,第一次强制轮转后的旧文件是messages.1,cat messages.1会看到logger -t "呵呵" "再见!",到第二次就成messages.2。而第二次轮转后的messages.1成了第一次轮转后的messages的老文件。(看时间区别)