rsyslog 系统日志服务(操作系统和应用程序的日志管理)
rsyslog是CentOS 6 以后版本的系统管理服务.它提供了高性能,出色的安全性和模块化设计. 尽管 rsyslog最初是常规的syslogd,但已发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地.
当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地. 即使在远程的目的地 和更精细的处理中,性能通常也被认为是“惊人的”.
不仅可以记录单机的日志,还可以将日志跨网络传输。
特性
多线程 
UDP, TCP, SSL, TLS, RELP 
MySQL, PGSQL, Oracle实现日志存储 
强大的过滤器,可实现过滤记录日志信息中任意部分 
自定义输出格式 
适用于企业级中继链
系统日志术语:写日志考虑两点,一归到哪个类;二是什么级别。

facility:设施,从功能或程序上对日志进行归类

内置分类:12个
auth(认证)、authpriv(授权)、cron(计划任务)、daemon(守护进程)、ftp、kern(内核)、lpr(打印)、mail(邮件)、news新闻、security(auth)安全认证、user(default)用户(默认)、uucp、syslog系统日志
自定义分类:8个
local0-local7

Priority: 优先级别,从低到高排序

debug调试、 info信息、 notice通知、warning(警告)、err(error)(错误)、crit(critical)错误(严重)、alert警报、emerg(panic)错误(恐慌)
rsyslog相关文件
程序包:rsyslog   
主程序:/usr/sbin/rsyslogd
CentOS6:/etc/rc.d/init.d/rsyslog{start|stop|restart|status}
CentOS7,8:/usr/lib/systemd/system/rsyslog.service
配置文件:/etc/rsyslog.conf      /etc/rsyslog.conf
库文件:/lib64/rsyslog/*.so
rsyslog配置文件

rokey和centos

/etc/rsyslog.conf 配置文件格式:由三部分组成 
MODULES:相关模块配置 
GLOBAL DIRECTIVES:全局配置 
RULES:日志记录相关的规则配置

ubuntu

/etc/rsyslog.conf主配置文件放
MODULES:相关模块配置
GLOBAL DIRECTIVES:全局配置

/etc/rsyslog.d/*.conf
RULES:日志记录相关的规则配置

其中规则格式如下解释

*.info;mail.none;authpriv.none;cron.none       /var/log/messages
所有的分类只要是达到info级的 都放在这个文件,除了mail、authpiv、cron的
  
authpiv.*不管什么级别,都放在  /var/log/secuer 不带横线,只要发生,立马写磁盘
mail.*  不管什么级别,都放在  -/var/log/maillog  横线代表异步存放,先放缓冲区,过一会放,减少io
改完规则重启服务:systemctl restart rsyslog.server

RULES配置格式:

设施.级别;设施.级别    文件

facility格式:

* #所有的facility 
facility1,facility2,facility3,... #指定的facility列表

priority格式:

*: 所有级别 
none:没有级别,即不记录 
PRIORITY:指定级别(含)以上的所有级别 
=PRIORITY:仅记录指定级别的日志信息
将ssh服务的日志记录至自定义的local的日志设备
打开ssh服务端的配置文件可看到关于日志信息,设施属于AUTH 级别是INFO
此时去查看rsyslog配置文件设施为AUTH的放在哪个目录

#修改sshd服务的配置,定义自定义设施,并把关于ssh的日志信息放在单独定义的日志文件中
Vim/etc/ssh/sshd_config
syslogfacility local2            #local2是自定义分类
service sshd reload

修改rsyslog的配置
Vim /etc/rsyslog.conf 
Local2.*   /var/log/sshd.log     
systemctl restart rsyslog

ssh登录后,查看/var/log/sshd.log有记录
tail /var/log/sshd.log有记录
启用网络日志服务(将各机器的日志集中存放)

启用网络日志服务功能,可以将多个远程主机的日志,发送到集中的日志服务器,方便统一管理

CentOS 8 启用网络日志功能
ss -ntlu 看有没有514端口
vim /etc/rsyslog.conf把模块打开
#provides UDP syslog reception
#for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp")
input(type="imudp" port="514")

#provides TCP syslog reception
#for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imtcp")
input(type="imtcp" port="514")
查看是否开启
ss -ntlu 看有没有514端口
systemctl restart rsyslog

在客户端指定将日志发送到远程的TCP,UDP的日志服务器
vim /etc/rsyslog.conf  #日志不仅在本地/var/log/myssages存放,而且通过网络在远程主机存放
*.info;mail.none;authpriv.none;corn,none      /var/log/myssages
*.info;mail.none;authpriv.none;corn,none      @@10.0.0.18:514    #tcp
*.info;mail.none;authpriv.none;corn,none      @10.0.0.18:514    #udp
systemctl restart rsyslog

发过来存在哪里?通过vim /etc/rsyslog.d/50-default.conf文件定义
*.*;auth,authpriv.none   -/var/log/sysylog  过来后存放位置
systemctl restart rsyslog

可在客户端用测试日志来判断:logger "this is a test log"
如果日志没看到,可能是级别不够,调整下级别,可再测试logger "this is a 2test log"
常见日志文件
1、/var/log/secure,/var/log/auth.log:系统安全日志,文本格式,应周期性分析 

2、/var/log/btmp非文本文件:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,
lastb命令进行查看 如果有人暴力破解你的密码,就会产生很多失败登录的记录,文件越大,可能有人破解你的密码
读取里面有多少条记录:lastb -f /var/log/btmp |wc -l   需要更改端口,别人就没法连接你了
lastb -f /var/log/btmp |awk '{print $3}' |sort |uniq -c | sort -nr |head -3
如果有个ip连接的多,把他单独统计出来,写个iptables禁用规则。
iptables -A INPUT -s 178.128.193.12 -j DROP

3、/var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看

4、/var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看

5、/var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化将不再记录,开机之后可以通过专用命令 dmesg查看,可持续记录硬件变化的情况 

6、/var/log/boot.log 操作系统服务启动的相关信息,文本格式 

7、/var/log/messages :系统中大部分的信息 

8、/var/log/anaconda : anaconda的日志   安装操作系统进行选择的信息

规模化自动安装用到的kickstart的应答文件,如果实现kickstart的安装,可去b站查看,99-103

面试题:用哪个命令可以查到切换运行级别的过程 last -x

runlevel可查看运行级别
init 5 可切换运行级别
last -x 可查看到切换运行级别的信息、关机信息、重启、用户登录
日志管理工具 journalctl

CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志.带来的好处就是,可以只用 journalctl一个命令,查看所有日志(内核日志和应用日志).

日志的配置文件

/etc/systemd/journald.conf

journalctl命令格式

journalctl [options]
journalctl用法(代表命令)
查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl

查看指定时间的日志
journalctl --since"2017-01-10" --until "2017-01-11 03:00"

查看进程的日志:某一服务的日志
journalctl -u sshd.service -o json
实战案例:利用 MySQL 存储日志信息
目标

利用rsyslog日志服务,将收集的日志记录于MySQL中

环境准备
两台主机 
一台:rsyslog日志服务器,IP:10.0.0.8 
一台:mysql数据库服务器,IP:10.0.0.18
实现步骤(日志服务器)
在rsyslog服务器上安装连接mysql模块相关的程序包

10.0.0.8:

安装rsyslog-mysql
centos:yum -y install rsyslog-mysql
ubuntu:apt -y install rsyslog-mysql

查看包信息并查看sql脚本文件内容
centos:rpm-ql rsyslog-mysql
cat /usr/share/doc/rsyslog/mysql-createDB.sql
ubuntu:dpkg-L rsyslog-mysql
cat /usr/share/dbconfig-common/data/rsyslogmysql/install/mysql

把脚本复制到数据库服务上
rocky:scp /usr/share/doc/rsyslog/mysql-createDB.sql 10.0.0.18:/data
ubuntu:scp /usr/share/dbconfig-common/data/rsyslogmysql/install/mysql 10.0.0.18:/data
准备MySQL

10.0.0.18:

如果rsyslog服务器是rocky系统: 
yum -y install mysql-server
在MySQL数据库服务器上创建相关数据库和表,并授权rsyslog能连接至当前服务器
systemctl enable --now nysqld
mysql> source /data/mysql-createDB.sql
mysql> create user 'rsyslog'@'10.0.0.%' identified by '123456';
mysql> grant all on syslog.* to 'rsyslog'@'10.0.0.%';

如果rsyslog服务器是ubuntu系统: 
yum -y install mysql-server
在MySQL数据库服务器上创建相关数据库和表,并授权rsyslog能连接至当前服务器
systemctl enable --now nysqld; mysql -e "create database Syslog"
mysql> use Syslog;
mysql> source /data/mysql
mysql> create user 'rsyslog'@'10.0.0.%' identified by '123456';
mysql> grant all on syslog.* to 'rsyslog'@'10.0.0.%';
配置日志服务器将日志发送至指定数据库(日志服务器)

10.0.0.8:

rokey
配置rsyslog将日志保存到mysql中
vim /etc/rsyslog.conf
#在 MODULES 语言下面,如果是 CentOS 8 加下面行
module(load="ommysql")
#在 MODULES 语言下面,如果是 CentOS 7 , 6 加下面行
$ModLoad ommysql

在RULES语句块下面行的格式
vim /etc/rsyslog.d/50-default.conf
#facility.priority  :ommysql:DBHOST,DBNAME,DBUSER,password
*;auth,authpriv.none   :ommysql:10.0.0.18,Syslog,rsyslog,123456
systemctl restart rsyslog.service


ubuntu
自动生成以下配置文件,只需要按环境修改
cat /etc/rsyslog.d/mysql.conf
#configuration file for rsyslog-mysql
#changes are preserved

module(load="ommysql")
*.* action(type="ommysql" server="10.0.0.18" db="syslog" uid="rsyslog" pwd="123456")
测试
在日志服务器上生成日志
logger "this is a test log"
在数据库上查询到上面的测试日志
mysql> select count(*) from systemevents\G
Logrotate 日志转储
logrotate 程序是一个日志文件管理工具.用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动.可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行
Logrotate 配置
软件包:logrotate     

相关文件 
计划任务:/etc/cron.daily/logrotate 
程序文件:/usr/sbin/logrotate
配置文件: /etc/logrotate.conf 
日志文件:/var/lib/logrotate/logrotate.status
怎么样执行一个命令,删除一个月前的日志,
find /var/log -mtime +30 -ok rm -rf {} \;  -ok 删除会询问 {}表示匹配的文件名
或做个日志转储规则
Logroate 配置范例

rocky系统下:计划任务里每天会调用logrotate,看是否有需要转储的信息,logrotate命令是将旧的日志文件改个名字,重新生成一个新的日志文件,即转储

cat /etc/cron.daily/logrotate 
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE
#转储计划任务和放置转储规则的文件

ubuntu系统下:和定时器有关,和rocky的计划任务类似,每天执行logroate服务

cat /lib/systemd/system/logroate.timer
[Unit]
Description=Daily rotation og log files
Documentation=man:logrotate(8) man:logrotate.conf

[Timer]
OnCalendar=daily
AccurcySec=12h
Persistent=true

[Install]
WantedBy=timers.target

日志转储规则全局性配置文件

cat /etc/logrotate.conf      
# see "man logrotate" for details
# rotate log files weekly
weekly                                  #不写默认一周转储一次    daily 一天

su root adm                             #转储时设置权限root用户、adm组
 
# keep 4 weeks worth of backlogs
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                #各自日志的转储规则可以单独放

# system-specific logs may be also be configured here.

也可以配置成文件size达到多大转储  size=1M 则文件达到1M就会转储,生成新文件

ls /etc/logrotate.d可查看每一个文件定义的相关日志的转储规则

如:alternatives apport apt bootlog btmp dpkg rsyslog 等

日志转储规则配置文件主要参数:

配置参数

说明

compress

通过gzip压缩转储以后的日志

nocompress

不压缩

copytruncate

用于还在打开中的日志文件,把当前日志备份并截断

nocopytruncate

备份日志文件但是不截断

create mode owner group

转储文件,使用指定的权限,所有者,所属组创建新的日志文件

nocreate

不建立新的日志文件

delaycompress

和 compress 一起使用时,转储的日志文件到下一次转储时才压缩

nodelaycompress

覆盖 delaycompress 选项,转储同时压缩

errors address

专储时的错误信息发送到指定的Email 地址

ifempty

即使是空文件也转储,此为默认选项

notifempty

如果是空文件的话,不转储

mail address

把转储的日志文件发送到指定的E-mail 地址

nomail

转储时不发送日志文件

olddir directory

转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件 系统

noolddir

转储后的日志文件和当前日志文件放在同一个目录下

prerotate/endscript

在转储以前需要执行的命令,这两个关键字必须单独成行

postrotate/endscript

在转储以后需要执行的命令,这两个关键字必须单独成行

daily

指定转储周期为每天

weekly

指定转储周期为每周

monthly

指定转储周期为每月

rotate count

指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5个备份

tabooext [+] list

让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~

size size

当日志文件到达指定的大小时才转储,bytes(缺省)及KB或MB

sharedscripts

默认,对每个转储日志运行prerotate和postrotate脚本,日志文件 的绝对路径作为第一个参数传递给脚本. 这意味着单个脚本可以针对 与多个文件匹配的日志文件条目多次运行(例如/ var / log / news / *.example). 如果指定此项sharedscripts,则无论有多少个日志 与通配符模式匹配,脚本都只会运行一次

nosharedscripts

针对每一个转储的日志文件,都执行一次prerotate 和 postrotate脚 本,此为默认值

missingok

如果日志不存在,不提示错误,继续处理下一个

nomissingok

如果日志不存在,提示错误,此为默认值

范例: 设置nginx的日志转储

cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {      这个目录下的以log结尾的文件进行转储
daily                      一天一次
rotate 100                 可保存100天
missingok                  丢了无所谓
compress                   压缩
delaycompress              延迟压缩
notifempty                 是空不转储
create 644 ngnix nginx     权限644 所有者 所属组 
postrotate                              
if[ -f /app/nginx/logs/nginx.pid ];then  转储之后,为了保证nginx还能读到新生成的空的nginx日志
kill -USR1`cat/app/nginx/logs/nginx.pid`  需要执行这个命令
fi
endscript
}

各配置参数说明看具体文档

ssh -p 9527 install wangxiaochun.com

对指定日志手动执行日志转储
生成测试日志
dd if=/dev/zero of=/var/log/test1.log bs=2M count=1

针对不同的日志创建转储配置文件
cat /etc/logrotate.d/test1  创建一个test1的日志转储文件
/var/log/test1.log { 
daily                     #一天一转储
rotate 5                  #保留最近5个版本
compress                  #通过gzip压缩转储以后的日志
delaycompress             #延迟压缩
missingok                 #丢失不报警
size 1M                   #达到1M进行转储
notifempty                #如果是空文件的话,不转储
create 640 bin wang       #创建权限和用户、组
postrotate                #执行完转储之后在执行以下命令,把时间存到文件中去
echo `date +%F_%T` >> /data/test.1log
endscript
}

可计划任务执行,也可直接手动执行
logrotate /etc/logrotate.d/test1 但是得满足1M,需要提前创建账号,创建目录/data
ll /var/log/test