日志服务
众多服务器,API接口等:可以转储到数据库中进行存储日志,例如存储到MongoDB中取查看
日志服务的转储和切割,很有意义
定义日志的记录级别
日志的分类:应用日志+内核日志,app log+kernal log
rsyslog服务:Cent OS7往后的服务,日志可以统一记录到MySQL内,可以通过rsyslog统一推送到不同的服务内
[root@rocky postgresql]#rpm -qa rsyslog
rsyslog-8.2102.0-7.el8.x86_64
rpm -ql rsyslog
systemctl status rsyslog
可将例如系统的内核日志,或者tcp/udp的服务日志,推送到例如ES,文件(典型),hdfs大数据平台,mail(邮箱),mongodb文档数据库,MySQL数据库等
rsyslog就是类似一个管道,负责推送服务日志到指定的地方,例如docker的容器日志(容器也要映射端口出来),或者是service对外也是30000随机端口,证明也是TCP协议的服务,可以通过rsyslog来推送
ELK服务:elastic search+logstash+kibanna
其实ES就是一个数据库来的,一个索引=MySQL内的一个库
ES:开源的搜索引擎,负责收集源端的业务服务日志源,例如nginx,tomcat等
logstash:日志存储引擎,对日志进行收集、分析、过滤filter等
kibana:提供一个有好的界面
rsyslog管理
1.facility设施:将应用程序日志进行分类
#内置分类
auth认证,cron定时任务,daemon守护进程,ftp文件服务,mail邮件服务,security安全
#自定义分类
local0-local7
2.priority优先级,日志记录优先级,告警的优先级,比如说达到warning或者error才记录到对应的日志引擎中
debug调试,info通知(notice),warning警告,error报错,critical重要(阿里云打电话通知),alert等
3.查看rsyslog的配置文件,主配置文件.conf,默认配置
rules规则内,mail.*表示只要是mail的事件,不关心优先级priority,直接写入到日志内,异步写入
*.info;mail.none;authpriv.none;cron.none
/var/log/messages --->系统日志general日志,所有事件的写入,排除mail,auth,cron,因为下面都有
只记录所有的info级别的日志,都会写入到里面,info、warning及以上
rpm -ql rsyslog
rpm -qc rsyslog
[root@rocky ~]#rpm -qc rsyslog
/etc/logrotate.d/syslog
/etc/rsyslog.conf
/etc/sysconfig/rsyslog
##查看rules的规则,有不同的分类
*.info;mail.none;authpriv.none;cron.none /var/log/messages --->系统日志general日志
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:* --->非常重要的错误,崩溃日志
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
1./var/log/messages
系统日志,专门记录系统内所有的日志,操作,包括机器的启动,开机关机,守护进程的启动,启动顺序等,一般都是systemd下面的事件
比如我需要更新一下yum源,会记录安装的过程服务等
systemctl enable --now postfix
比如说我修改错一个.conf文件的语法,日志内会指出是45行出现了语法错误
vim +45 /etc/httpd/conf/httpd.conf
2.基于各种服务的日志
ssh服务的日志,日志记录级别是authpriv,在rsyslog里面有记录规则,是写到secure里面,主要和认证授权有关系,安全,任何关于安全的信息,都会记录
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO
tail -f /var/log/secure --->基本都是一些认证之类的日志,这里有从VMNET链接过来的SSH登录信息
例子:修改SSHD服务的日志
先看sshd_config,可以修改他的默认级别,默认是authpriv,可以写local0-6的级别,local7为启动日志boot.log
# Save boot messages also to boot.log
local7.*
vim sshd_config
--->修改默认的监听级别
#SyslogFacility AUTH
SyslogFacility LOCAL6
#SyslogFacility AUTHPRIV
vim /etc/rsyslog.conf
#可以修改他的子配置文件
# Include all config files in /etc/rsyslog.d/,默认的
include(file="/etc/rsyslog.d/*.conf" mode="optional")
vim /etc/rsyslog.d/sshd.conf
local6.* /var/log/sshd.log
ls /var/log/sshd.log
##重启服务
systemctl restart sshd rsyslog
[root@rocky ~]#ls /var/log/sshd.log
/var/log/sshd.log
[root@rocky ~]#cat /var/log/sshd.log
Oct 1 08:31:05 rocky sshd[5346]: Received signal 15; terminating.
Oct 1 08:31:05 rocky sshd[5545]: Server listening on 0.0.0.0 port 22.
Oct 1 08:31:05 rocky sshd[5545]: Server listening on :: port 22.
远程推送日志:TCP/UDP514端口
环境:日志服务器/日志服务10.0.0.132
客户端主机:推送服务,10.0.0.128
可以开启TCP协议推送日志,port:514端口,服务模块:imtcp和imudp,都是安装rsyslog的时候安装好的,可以通过UDP:514来传输这个日志,也可以使用TCP端口514,比较靠谱
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
---修改rsyslog.conf,使得local6的日志记录到/var/log/sshd.log下面,重启rsyslog服务,远程过来的local6级别的日志也记录到sshd.log文件中
# Save boot messages also to boot.log
local7.* /var/log/boot.log
local6.* /var/log/sshd.log
systemctl restart rsyslog sshd
ss -ntlu | grep 514
[root@rocky ~]#ss -ntlu | grep 514
udp UNCONN 0 0 0.0.0.0:514 0.0.0.0:*
udp UNCONN 0 0 [::]:514 [::]:*
将另外一台主机的SSH记录到10.0.0.132上面,默认开启的是514 UDP端口,也可以开启TCP协议,还可以一起使用都传输,写法如下
vim /etc/sshd/sshd_config
#SyslogFacility AUTH
SyslogFacility LOCAL6
#SyslogFacility AUTHPRIV
vim /etc/rsyslog.d/sshd.conf
写子配置文件
local6.* @10.0.0.132:514 ##UDP协议
local6.* @@10.0.0.132:514 ##TCP协议
#重启服务
systemctl restart rsyslog sshd
这里可以发现主机名为rocky和master都记录下来了
同理,也可以写例如/var/log/messages记录到远程主机,直接写例如,推送到远程主机上面
vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none @10.0.0.132:514 @@10.0.0.132:514 ##TCP协议
常用日志
lastb:查看错误登录的日志信息,这个貌似是每天都会清理的
/var/log/messages:系统通用日志
自定义local级别,自定义服务的日志设施facility到指定目录,重启服务
mysqld.log,MySQL通用日志
nginx,access.log:访问日志
errer.log:错误日志等等,基本如果是Yum安装的话,都会默认记录在/var/log/下面
journalctl:显示日志信息的语句,查看语句
案例:使用MySQL进行日志的转储
1.环境配置
10.0.0.132 MySQL
10.0.0.128 rsyslog日志服务器
10.0.0.129 客户端,推送服务日志
128配置rsyslog服务
vim /etc/rsyslog.conf
#centos 7开启 tcp 514端口
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
vim /etc/rsyslog.d/sshd.conf --->接收所有来自local6级别的日志,存储到client.log上面
local6.* /var/log/client.log
systemctl restart rsyslog
ss -ntl | grep 514
[root@master ~]#ll /var/log/ | grep cli
-rw------- 1 root root 141 Oct 1 11:44 client.log
[root@master ~]#ss -ntl | grep 514
LISTEN 0 25 *:514 *:*
LISTEN 0 25 [::]:514 [::]:*
cat查看
[root@master ~]#cat /var/log/client.log
Oct 1 03:44:26 slave1 sshd[16300]: Server listening on 0.0.0.0 port 22.
Oct 1 03:44:26 slave1 sshd[16300]: Server listening on :: port 22.
129配置推送
--->sshd_config更改
#SyslogFacility AUTH
SyslogFacility LOCAL6
#SyslogFacility AUTHPRIV
--->建立推送机制
[03:46:33 root@slave1 ~]#vim /etc/rsyslog.d/gerneral.conf
local6.* @@10.0.0.128:514
systemctl restart rsyslog sshd
2.安装rsyslog-mysql服务,推送日志
安装rsyslog-mysql
yum -y install rsyslog-mysql
[root@rocky ~]#rpm -ql rsyslog-mysql
/usr/lib/.build-id
/usr/lib/.build-id/e6
/usr/lib/.build-id/e6/aa0e40c19a2e0524d72780eee3b1698684cbe7
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog/mysql-createDB.sql
将初始化脚本复制到MySQL,创建账号,授权
scp /usr/share/doc/rsyslog/mysql-createDB.sql 10.0.0.132:/root
查看mysql-create脚本,其实就是创建一个syslog日志库,需要创建一个日志同步账号,给这个库授权
[root@rocky ~]#cat mysql-createDB.sql
CREATE DATABASE Syslog;
USE Syslog;
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
);
##执行授权,查看表
source /root/mysql-createDB.sql
create user rsyslog@'%' identified by '123';
grant all on Syslog.* to rsyslog@'%';
flush privileges;
[Syslog]>show tables;
+------------------------+
| Tables_in_Syslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
3.调用/usr/lib64/rsyslog/ommysql.so这个模块进行推送
编辑/etc/rsyslog.conf
##类似这个写法
$ModLoad imtcp
$InputTCPServerRun 514
$ModLoad ommysql
##将所有的日志包括本地的通用日志推送到MySQL
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.132,Syslog,rsyslog,123 --->对应的库,远程连接的user,密码
##128重启服务,两张表已经有内容了
systemctl restart rsyslog
![image-20221001121152698](/i/l/?n=22&i=blog/2792175/202210/2792175-20221028232739713-1384965478.png)
systemevents推送记录了系统日志
成功记录了slave1机器的日志
slave1的messages也推送到MySQL内
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none @@10.0.0.128
[Syslog]>select * from SystemEvents where message like '%am%'\G;
*************************** 1. row ***************************
ID: 22
CustomerID: NULL
ReceivedAt: 2022-10-01 12:19:29
DeviceReportedTime: 2022-10-01 04:19:29
Facility: 1
Priority: 5
FromHost: slave1
Message: i am slave1
![image-20221001141638531](/i/l/?n=22&i=blog/2792175/202210/2792175-20221028232740130-872923460.png)
日志转储logrotate
切分日志,可以按照创建时间/日志文件大小来切分日志格式,比如可以一天创建一份日志,或者是达到100M自动生成一个新日志,类似mysql-binlog日志或者docker日志的max-size选项
还可以定义自动删除掉N天前的日志文件,保留最新的7天日志
包:logrotate
默认:一天执行一次拆分
[root@master tmp]#rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/etc/rwtab.d/logrotate
/usr/sbin/logrotate
##调用这个logrotate的配置文件,如果状态码不等于0,则退出,警告logrotate执行失败
vim /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
logrotate配置文件
vim /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly --->其实是一周进行一次日志的切分
weekly
# keep 4 weeks worth of backlogs --->保留4周
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.
日志针对服务的转储策略,证明在/var/log下已经有这么多服务需要日志来记录了
ls /etc/logrotate.d
[root@rocky ~]#ls /etc/logrotate.d
bootlog chrony dnf httpd kvm_stat libvirtd.qemu php-fpm samba syslog wtmp
btmp cups firewalld iscsiuiolog libvirtd numad psacct sssd wpa_supplicant
##不同的服务,配置的日志保存规则,时间等都不一样
##cron定时任务日志
cat httpd
/var/log/httpd/*log { ##指定日志路径,为服务/程序默认的日志存放路径,这个
missingok ##丢失了也OK
notifempty ##如果当天的日志为空,则不切分
sharedscripts
delaycompress ##生成日志后延迟压缩
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
cat nginx
/apps/nginx/logs/*.log { ##指定日志路径,为服务/程序默认的日志存放路径,nginx默认有access.log或者error.log
daily ##每天切分日志,每天生成
rotate 5 ##保留最新的5分日志文件
missingok ##丢失了也OK
notifempty ##如果当天的日志为空,则不切分
size 10M ##规则:超过10M的日志文件也进行转储
compress ##压缩
delaycompress ##生成日志后延迟压缩
create 644 nginx nginx ##生成日志的属性,权限为644(rw-r--r--),属组为nginx
postrotate
if [ -f /apps/nginx/logs/nginx.pid ];then
kill -USR1 `cat /apps/nginx/logs/nginx.pid` --->nginx的特性,发现日志的名字修改后,重新生成日志文件
fi
endscript
}
![image-20221001232133445](/i/l/?n=22&i=blog/2792175/202210/2792175-20221028232740637-467955986.png)
基于针对nginx服务做的日志切割,相关语法
日志转储测试
##生成2M的日志文件,模拟每天的记录
dd if=/dev/zero of=/var/log/test1.log bs=2M count=1
dd if=/dev/zero of=/var/log/test2.log bs=2M count=1
ll /var/log/test*
-rw-r--r--. 1 root root 2 10月 1 23:57 /var/log/test1.log
-rw-r--r--. 1 root root 2 10月 1 23:57 /var/log/test2.log
##配置日志转储规则,在这个目录下编辑好配置文件,默认是每天都生成一个日志的规则,daily,只要前一天的写完了,或者大小达到1M了,就需要切分了,切分规则按照主配置文件logrotate.conf来命名
vim /etc/logrotate.d/test1
/var/log/test1.log {
daily
rotate 3
compress ##自动压缩成gz文件,直接压缩了,可以的,匹配符合条件直接压缩,生成新的日志文件后,旧的日志文件直接压缩
missingok
size 1M ##触发大于1M的规则,转储
notifempty
create 644 root root
echo `date +%F_%T` >> /root/test1.log
endscript
}
----主配置文件
# see "man logrotate" for details
# rotate log files weekly
weekly
# 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.
##直接调用,一般来说是cron.daily,每天执行一次的,得到一份压缩后的日志文件
[root@rocky cron.daily]#pwd
/etc/cron.daily
logrotate
logrotate /etc/logrotate.d/test1
[root@rocky logrotate.d]#ll /var/log/test*
-rw-r--r--. 1 root root 0 10月 2 00:04 /var/log/test1.log
-rw-r--r--. 1 root root 2067 10月 2 00:03 /var/log/test1.log.1.gz
[root@rocky logrotate.d]#logrotate /etc/logrotate.d/test1
[root@rocky logrotate.d]#ll /var/log/test*
-rw-r--r--. 1 root root 0 10月 2 00:16 /var/log/test1.log
-rw-r--r--. 1 root root 2097152 10月 2 00:16 /var/log/test1.log.1
-rw-r--r--. 1 root root 2067 10月 2 00:03 /var/log/test1.log.1.gz
-rw-r--r--. 1 root root 2097152 10月 2 00:03 /var/log/test2.log
标签:服务,log,logrotate,rsyslog,var,日志,root
From: https://www.cnblogs.com/catyer/p/16837825.html