日志管理——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里

思路:

  1. 通过修改配置文件完成
  2. 重启rsyslog服务
  3. 测试验证

步骤:

$ 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

思路:

  1. 在ssh-server上将ssh服务单独记录
  2. 在ssh-server上通过修改/etc/rsyslog.conf文件将本地ssh服务日志远程传送到log-server服务器上;
  3. 在log-server上打开514端口等待客户传送日志
  4. 测试验证
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服务
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
原文地址:https://www.cnblogs.com/lvzhenjiang/p/14411188.html