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