rsyslog是一个linux系统日志服务的工具,主要用来监控收集系统从开机运行之后所发生的所有日志,包括内核日志,服务日志,应用日志等等;记录的日志全部都写到/var/log下面,常用的有dmsg(内核日志)、messages(一般运行日志)、boot.log(系统启动日志)。
1、主机环境:
主机名 | IP地址 | 备注 |
rsyslog-server | 192.168.17.160 | 日志服务器 |
rsyslog-client | 192.168.17.161 | 客户端 |
2、rsyslog-server搭建:
1)配置主机名:
hostnamectl set-hostname rsyslog-server
2)修改配置文件:
cp /etc/rsyslog.conf{,.bak}
vim /etc/rsyslog.conf
修改的配置文件内容:
说明:取消两行注释。# 使用UDP协议,开启514端口。
3)然后启动服务并设置开机自启动:
systemctl start rsyslog.service
systemctl enable rsyslog.service
3、rsyslog-client搭建:
1)修改主机名:
hostnamectl set-hostname ryslog-client
2)yum 安装nginx:
yum install nginx -y
3)修改配置文件rsysconfig.conf:
cp /etc/rsyslog.conf{,.bak}
vim /etc/ryslog.conf
4)然后启动rsyslog.service服务,并设置开机自启动:
systemctl start rsyslog.service
systemctl enable rsyslog.service
4、测试:
1)在rsyslog-client客户端重启下nginx:
systemctl restart nginx
2)然后到rsyslog-service日志服务器上检查下/var/log/messages:
tail /var/log/messages
可以看到日志传到了日志服务器上来了。
在这个过程中,我看到时间显示不对,是服务器的时间没有同步,所以我对rsyslog-server和rsyslog-client两台服务器进行了时间同步,执行完成之后,再检查日志的时间就正常了。
ntpdate time1.aliyun.com
5、相关的日志概念:
1)日志分类:
# facility: 设置、信道,可以理解为日志来源类型:
auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security, user, uucp, syslog, local0-local7
# priority: 日志等级(debug为最低、emerg为最严重)
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
2)在RULES这个区域中,就是配置监控日志来源的类型和优先级,以及写入到log日志文件中。
规则:
facility.priority target
例如: 上图中,mail 表示监控日志来源的类型;*表示所有日志的级别;/var/log/maillog表示日志存放路径。
在配置文件的末尾,标红被注释掉的部分是如何添加将本地日志如何同步至远端的写入规则;
*.* @192.168.0.1:514 (使用UDP协议传输至远端日志服务器中)
*.* @@192.168.0.1:514 (使用TCP协议传输至远端日志服务器中)
*.* 意思是类型(all),优先级(all)
6、rsyslog日志的分类:只需要在rsyslog-server上配置:
1)修改/etc/rsyslog.d/default文件,尽量避免修改主配置文件。
vim /etc/rsyslog.d/default
#### GLOBAL DIRECTIVES ####
# Use default timestamp format # 使用自定义的格式
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template myFormat,"%timestamp% %fromhost-ip% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate myFormat
# 根据客户端的IP单独存放主机日志在不同目录,rsyslog需要手动创建
$template RemoteLogs,"/var/log/rsyslog/%fromhost-ip%/%syslogtag%_%$YEAR%-%$MONTH%-%$DAY%-%$hour%:%$minute%.log"
# 排除本地主机IP日志记录,只记录远程主机日志
:fromhost-ip, !isequal, "127.0.0.1" ?RemoteLogs
# 忽略之前所有的日志,远程主机日志记录完之后不再继续往下记录
& ~
2)在修改/etc/sysconfig/rsyslog文件:
SYSLOGD_OPTIONS="r -m 0 -c 2"
3)创建/var/log/rsyslog目录,并修改权限:
mkdir /var/log/rsyslog
chmod a+w /var/log/rsyslog
4)重启下rsyslog服务:
systemctl restart rsyslog.service
5)测试验证:
# 客户端重启下nginx服务:
systemctl restart nginx.service
# 在日志服务器上检查下日志:
7、使用mysql存储日志信息:
1)安装mariadb:
# rsyslog-server安装:
yum -y install mariadb mariadb-server
# rsyslog-client安装:
yum -y install rsyslog-mysql mariadb-server
2)配置日志服务器端:
a)设置启动和开机自启动mariadb服务器:
systemctl enable mariadb.service
systemctl start mariadb.service
b) 数据库初始化:
mysql_secure_installation # 数据库初始化
设置mariadb的root用户密码:123456(当然这个是在测试环境,如果是正式环境,就不要使用这个简单密码了。)
c)创建数据库rsyslog、创建rsyslog用户,并设置密码:
mysql -uroot -p
输入密码登录:
create database rsyslog;
show databases;
grant all privileges on rsyslog.* to 'rsyslog'@'%' identified by '123456';
flush privileges;
d)修改配置文件/etc/my.cnf:
vim /etc/my.cnf
skip_name_resolve=on # 这个参数是禁止域名解析
innodb_file_per_table=on # 共享表空间转化为独立表空间
e)然后再重新启动下数据库:
systemctl restart mariadb.service
3) 配置rsyslog-client客户端:
a)修改下/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql文件:
将文件中的create database命令删除,然后修改下第二行的数据库名称为rsyslog:
USE rsyslog;
CREATE TABLE SystemEvents
(
ID int unsigned not null auto_increment primary key,
CustomerID bigint,
ReceivedAt datetime NULL,
DeviceReportedTime datetime NULL,
Facility smallint NULL,
Priority smallint NULL,
FromHost varchar(60) NULL,
Message text,
NTSeverity int NULL,
Importance int NULL,
EventSource varchar(60),
EventUser varchar(60) NULL,
EventCategory int NULL,
EventID int NULL,
EventBinaryData text NULL,
MaxAvailable int NULL,
CurrUsage int NULL,
MinUsage int NULL,
MaxUsage int NULL,
InfoUnitID int NULL ,
SysLogTag varchar(60),
EventLogType varchar(60),
GenericFileName VarChar(60),
SystemID int NULL
);
CREATE TABLE SystemEventsProperties
(
ID int unsigned not null auto_increment primary key,
SystemEventID int NULL ,
ParamName varchar(255) NULL ,
ParamValue text NULL
);
b)将该sql文件导入到服务器端的数据库:
mysql -ursyslog -h 192.168.17.160 -p< mysql-createDB.sql
password:
c)修改下客户端的配置文件:
vim /etc/rsyslog.conf
d)然后重启下rsyslog服务:
systemctl restart rsyslog.service
4)测试检验:
在客户端重启下nginx:
systemctl restart nginx.service
然后到服务器端数据库中检查数据库中表是否有数据:
mysql -ursyslog -p
mysql> show databases;
mysql> user rsyslog;
mysql> select * from SystemEvents;
rsyslog的配置详解,请参考:
rsyslog 配置详解 - 君无颜 - 博客园