Rsyslog系统日志管理

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%\n"

: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.
  1. 更改ssh服务的默认日志记录载体
  2. 通过rsyslog程序去管理来自指定设备载体的日志记录到指定的文件(修改/etc/rsyslog.conf)
  3. 测试验证
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应用服务器上操作

  1. 将web服务器上的ssh服务的日志单独记录
    • 指定ssh服务的设备载体
    • 重启服务
  2. 将来自于ssh服务的日志设备载体上的日志远程发送到log-server上

以下操作在log-server上操作

  1. 通过修改配置文件,打开日志传输端口
    • 加载相应模块 tcp | udp
    • 打开接收端口 默认514端口
  2. 启动服务后日志默认会保存到/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是否打开

六、日志轮转

日志轮循(轮转):日志轮转,切割,备份,归档

  • 为什么要日志轮转?
  1. 避免日志过大占满/var/log的文件系统
  2. 方便日志查看
  3. 将丢弃系统中最旧的日志文件,以节省空间
  4. 日志轮转的程序是logrotate
  5. 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的老文件。(看时间区别)

posted @ 2019-06-14 10:59  谁与问倚楼人瘦  阅读(4107)  评论(0编辑  收藏  举报