日志管理——rsyslog、logrotate
目录
一、 rsyslog介绍
rsyslog
提供高性能、强大的安全特性和模块化设计。能够接受来自各种来源的输入,转换他们,并将结果输出到不同的目的地。性能通常被认为是“令人震惊的”!
二、系统日志文件介绍
日志格式:文本日志/二进制日志/数据库日志
常见日志文件:
/var/log/boot.log 系统引导日志,记录开机启动信息
/var/log/dmesg 核心的启动日志(硬件相关)
/var/log/messages 系统的日志文件
/var/log/maillog 邮件服务的日志
/var/log/xferlog ftp服务的日志
/var/log/secure 网络连接及系统登录的安全信息
/var/log/cron 定时任务的日志
/var/log/wtmp 记录所有的登入和登出(last -f 查看)
/var/log/btmp 记录失败的登入尝试(last -f 查看)
三、日志级别
日志信息分为以下级别,从上到下依次降低
none –什么都不记录
0 emerg –内核崩溃等严重信息
1 alert –需要立刻修改的信息
2 crit –严重级别,阻止整个系统或者整个软件不能正常工作的信息
3 err –错误级别,阻止某个功能或者模块不能正常工作的信息
4 warning –警告级别
5 notice –最具有重要性的普通条件的信息
6 info –一般信息的日志,最常用
7 debug –有调式信息的,日志信息最多
四、日志配置
4.1 日志定义相关符号
rsyslog`服务的配置文件:`/etc/rsyslog.conf
配置文件中常见的表示符号:
. 用来分隔服务和日志级别
* 任何服务或者任何级别
= 有等号表示等于某一级别,没有等号表示
! 排除操作,前面有相同服务的表达式,这个操作才有意义
; 用于分隔不同的 服务.级别 组合
, 用于分隔不同的服务
- 用于指定目标文件是,代表异步写入
4.2 了解配置文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 所有服务产生的日志,除了mail/验证/任务计划相关日志都记录到/var/log/messages
authpriv.* /var/log/secure
# 记录所有跟验证相关日志
mail.* -/var/log/maillog
# 记录所有跟邮件相关的日志信息
cron.* /var/log/cron
# 记录跟任务计划相关的日志
*.emerg :omusrmsg:*
# 把所有级别为emerg的信息发送给所有登录到系统上的用户
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
# 记录所有跟启动相关的日志信息
特别说明:
man rsyslog.conf 查看rsyslog配置的帮助信息
log facility 设备 设施:用来记录一种日志的日志设备
deamon
auth
authpriv
user
news
uucp
ftp
local0-7
五、实战演练
5.1 本地日志管理
5.1.1 将本地ssh服务的日志记录到/var/log/sshd.log里
思路:
- 通过修改配置文件完成
- 重启rsyslog服务
- 测试验证
步骤:
$ vim /etc/ssh/sshd_config
# 定义ssh服务的日志存储设备为local1
SyslogFacility local1
$ vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages
authpriv.*;local1.none /var/log/secure
# 定义ssh服务的local1设备载体不再向以上文件记录日志信息(依然会记录,不过不是详细信息)
local1.* /var/log/sshd.log
# 定义local1设备日志文件存储在/var/log/sshd.log中
$ systemctl restart sshd
$ systemctl restart rsyslog
# 找另一台服务登录测试
$ tail /var/log/sshd.log
Jul 12 18:43:11 lzj-01 sshd[19259]: Accepted password for root from 192.168.1.2 port 36210 ssh2
Jul 12 18:44:04 lzj-01 sshd[19259]: Received disconnect from 192.168.1.2: 11: disconnected by user
5.2 远程管理日志
5.2.1 将ssh服务的日志远程记录到日志管理服务器上保存。
环境:
192.168.1.1 log-server
192.168.1.2 ssh-server
192.168.1.3 client
思路:
- 在ssh-server上将ssh服务单独记录
- 在ssh-server上通过修改
/etc/rsyslog.conf
文件将本地ssh服务日志远程传送到log-server服务器上; - 在log-server上打开514端口等待客户传送日志
- 测试验证
log-server服务器
$ vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514 # UDP协议 514端口
$ModLoad imtcp
$InputTCPServerRun 514 # TCP协议 514端口
$ systemctl restart rsyslog
$ netstat -nltup | grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 19386/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 19386/rsyslogd
udp 0 0 0.0.0.0:514 0.0.0.0:* 19386/rsyslogd
udp6 0 0 :::514 :::* 19386/rsyslogd
ssh-server服务器
$ vim /etc/ssh/sshd_config
SyslogFacility local0
*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
authpriv.*;local0.none /var/log/secure
local0.* @@192.168.1.1:514
# 远程发送到192.168.1.1服务器上,@表示UDP @@表示TCP
$ systemctl restart sshd && systemctl restart rsyslog
client测试:
$ ssh root@192.168.1.2
log-server查看//var/log/messages日志
$ tailf /var/log/messages
Jul 12 19:36:57 ssh-server sshd[17203]: Accepted password for root from 192.168.1.3 port 60279 ssh2
如果日志服务器管理多台服务器,按照上面的方法就不好区分了,解决办法(在日志管理端优化)如下:
log-server服务器通过定义模板来保存不同的日志文件
$ vim /etc/rsyslog.conf
# 在文件末尾加入以下内容:
$template DynFile,"/var/log/system-%HOSTNAME%.log"
# 定义一个模板DynFile,将日志保存在/var/log里,文件为system-客户端的主机名.log
local0.* ?DynFile
# 动态调用定义的模板
$ systemctl restart rsyslog
client再次测试:
$ ssh root@192.168.1.2
log-server验证:
$ cat /var/log/system-ssh-server.log
Jul 12 19:43:26 ssh-server sshd[17256]: Accepted password for root from 192.168.1.3 port 60282 ssh2
六、日志轮转——logrotate
为什么要进行日志轮转?
- 避免日志文件过大,占用系统空间;
- 方便日志查看;
- 丢弃系统中最旧的日志文件,节省空间
- 日志轮转的程序时logrotate
- logrotate本身不是系统守护进程,它是通过计划任务crond每天执行
6.1 了解logrotate相关配置文件
$ egrep -v '^$|^#' /etc/logrotate.conf
weekly # 默认每一周执行一次rotate轮转工作
rotate 4 # 保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
create # 自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext # 这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的xxx.log-1这种格式
include /etc/logrotate.d # 导入/etc/logrotate.d/ 目录中的各个应用配置
/var/log/wtmp { # 仅针对/var/log/wtmp 所设定的参数
monthly # 每月一次切割,取代默认的一周
create 0664 root utmp # 指定新建的日志文件权限以及所属用户和组
minsize 1M # 文件大小超过1M 后才会切割
rotate 1 # 只保留一个日志
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
logrotate中其他可配置参数,具体如下:
compress # 通过gzip 压缩转储以后的日志
nocompress # 不做gzip压缩处理
copytruncate # 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate # 备份日志文件不过不截断
create mode owner group # 轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate # 不建立新的日志文件
delaycompress # 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress # 覆盖delaycompress 选项,转储同时压缩。
missingok # 如果日志丢失,不报错继续滚动下一个日志
errors address # 专储时的错误信息发送到指定的Email 地址
ifempty # 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty # 当日志文件为空时,不进行轮转
mail address # 把转储的日志文件发送到指定的E-mail 地址
nomail # 转储时不发送日志文件
olddir directory # 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir # 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts # 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate # 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate # 在logrotate转储之后需要执行的指令,例如重新启动(kill -HUP) 某个服务!必须独立成行
daily # 指定转储周期为每天
weekly # 指定转储周期为每周
monthly # 指定转储周期为每月
rotate count # 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext # 使用当期日期作为命名格式
dateformat .%s # 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持%Y %m %d %s 这四个参数
size(或minsize) log-size # 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
# 当日志文件>= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
# size = 5 或size 5 (>= 5 个字节就转储)
# size = 100k 或size 100k
# size = 100M 或size 100M
logrotate指令选项:
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。
6.2 ssh日志轮转
ssh服务日志现在是步骤5.1
的状态!
需求:
- 每天进行轮转,保留5天的日志文件
- 日志文件大小大于5M进行轮转
$ find /var/log/ -type f | xargs rm -f
$ find /var/log/ -type f -exec rm -f {} \;
$ find /var/log/ -type f -delete
# 将/var/log/目录下的所有文件进行删除(三种方法任选其一),方便查看而已
$ systemctl restart rsyslog # 产生logrotate服务定义的日志文件
$ logrotate -f /etc/logrotate.conf # 轮转logrotate定义的日志文件
$ vim /etc/logrotate.d/sshd
/var/log/sshd.log {
daily
compress
missingok
rotate 5
size 5M
}
$ logrotate -f /etc/logrotate.conf # 轮询一次
# 验证
$ ls /var/log/sshd.log*
/var/log/sshd.log /var/log/sshd.log-20200712.gz
6.3 nginx日志的日志配置示例参考:
$ vim /etc/logrotate.d/nginx
/var/log/weblog/*.log { //日志存放路径
daily //指定转储周期为每天
compress //通过gzip 压缩转储以后的日志
rotate 7 //保存7天的日志
missingok //如果日志文件丢失,不要显示错误
notifempty //当日志文件为空时,不进行轮转
dateext //使用当期日期作为命名格式,exp: nginx_access.log-20190120
sharedscripts //运行postrotate脚本
postrotate //执行的指令
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript //结束指令
}
6.4 解决logrotate无法自动轮询日志的方法
现象说明:
使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,检查后确定配置文件一切正常,这是为什么呢??
强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询。
故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将-t 参数替换成-f 参数
$ vim /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
$ systemctl restart crond
# 重启cron服务
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************