1.系统日志介绍:
所谓系统日志,记录的要素不外乎时间(系统日志记录的时间),地点(在那台主机上),人物(谁执行的操作或是某进程),事件(具体的任务或具体的操作)等;但是我们可以自定义系统日志记录的关键程度。这种记录在系统日志上成为记录级别(loglevel)。
2. 日志存储的方式:
系统日志记录有可能是本机上的日志(默认在/var/log/),也有可能是其他主机上的日志(可以基于udp514或tcp514端口或借助于其他程序发送自己主机上的日志[mysql])
3. ELK 简介
ELK:由三个软件组成elasticsearch,logstash,kibana 。非关系型分布式数据库
elasticsearch:是一个开源分布式的搜索引擎们可以处理大规模数据,如nginx,apache,系统日志等
logstash:对日志进行收集,分析,过滤,并将其存储后供以后使用
kibana :提供一个便于日志分析的wbe页面
4. sysklog和rsyslog系统日志服务
sysklog是cnetos5之前版本采用的日志管理系统服务。它主要包含两大块
syslogd(system application):记录应用日志
klogd(linux kernel log):记录内核日志
rsyslog是centos6之后版本的日志系统管理服务,相比sysklog,它提供了更高的性能,安全,以及模块化设计(动态装卸载)。而且他能接受各种来源的输入,并将其转换,然后输出到不同的目的地(如数据库)。这里主要将rsyslog。
rsyslog特性:
多线程
UDP,TCP,SSL,TLS
数据库实现存储
可以过滤记录日志信息中的任意部分
自定义输出格式
4 rsyslog管理
4.1 系统日志术语
facility:(设施),从功能或程序上对日志进行归类
常见的系统内置类:
auth,authpriv,cron,ftp,mail,syslog,security等
也可以自定义分类或系统预留分类:
local0-local7
priority(优先级),从低到高
debug,info,notice,warn,error,crit(critical),alter,emerg(紧急)
查看帮助:man 3 syslog(如果系统上无帮助手册,安装yum | dnf install -y man-pages),man logger
4.2 相关文件
程序包:rsyslog
主程序:/usr/sbin/rsyslogd
配置文件:/etc/rsyslog.conf 以及/etc/rsyslog.d/*.conf
库文件:/lib64/rsyslog/*.so
使用命令:rpm -ql rsyslog。即可查看安装程序生成的所有文件
4.2.1 rsyslog主配置文件格式(主配置:/etc/rsyslog.conf)
主要由三部分组成:
MODULES:相关模块配置(如需使用某模块,需要手动加载)
GLOBAL DIRECTIVES[指令]:全局配置
RULES:日志记录的相关规则
RULES:配置格式:facility.priority; facility.priority… target
facility格式:
* 表示所有的facility
facility1,facility2... 表示指定的facility列表
priority格式:
* 表示所有级别
none 表示没有级别,即不记录
priority 表示指定级别,包含以上的所有级别
=priority 仅记录指定级别的日志信息
target格式:
文件路径 :一般在/var/og/,文件路径前的”-“ 表示异步写入,没有“-” 表示同步写入
用户:将日志事件通知给指定的用户," * "表示登录的所有用户
日志服务器:@host,把日志发送到指定的远程UDP日志服务器上;@@host,八日至发送到指定的远程TCP日志服务器上
管道:| COMMAND ,转发给其他命令处理
4.2.2 通用的日志文件格式(/var/log/message,cron,secure等):
事件产生的日期时间 主机 进程[pid] :事件内容
范例:将ssh服务的日志记录至自定义的local的日志类别中。
1. 修改sshd服务的配置(/etc/ssh/sshd_config)
SyslogFacility AUTHPRIV 注释,添加 SyslogFacility local3
2. 修改rsyslog的配置(/etc/rsyslog.conf)
在rules下面添加locla3.* /var/log/test.log(自定义文件的路径)
3 .重启sshd,rsyslog;并测试(logger命令,打印自定的string至日志文件中)
4.2.3 启用网络日志服务:
启用网路日志服务功能,可以将多个远程主机的日志,发送到集中日志服务器上,便于集中管理。
实现原理是基于主配置文件中的tcp或udp端口。默认是注释掉了
实现步骤
1. 在集中管理的主机上打开监听的端口(tcp或udp或同时开),并查看端口514是否打开(重启rsyslog)
省略(在主配置文件中取消注释)
2. 在需要被管理的主机上的主配置文件中修改规则
*.info;mail.none;authpriv.none;cron.none位置添加一行
*.info;mail.none;authpriv.none;cron.none @10.0.0.110(udp) | @@ 10.0.0.110(tcp)
3. 测试
4.2.4 常见的日志文件
/var/log/secure : 系统安全日志,文本格式,应用周期性分析
/var/log/btmp:当前系统上,用户的失败尝试登录相关信息,二进制格式,使用lastb命令进行查看
/var/log/wtmp:当前系统上,用户正常登录的相关信息,二进制格式,使用last命令查看
/var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,使用lastlog命令查看
/var/log/dmesg[系统核心日志]:centos7之前版本系统引导过程中的日志信息,文本格式。但系统启动之后,将不在记录。使用dmesg命令进程查看
/var/og/boot.log :系统服务启动的相关信息,文本格式
/var/log/message:系统大部分的日志记录信息
/var/log/anaconda:anaconda的日志
范例1:找到失败登录的ip
[root@centos8 ~]#awk '/Failed password/{print $(NF-3)}' /var/log/secure
范例2:找出失败登录次数最多的前10个ip
[root@centos8 ~]#lastb -f btmp-test1 | awk '{print $3}'|sort | uniq -c|sort - nr|head
[root@centos8 ~]#lastb -f btmp-test2 | awk '{ip[$3]++}END{for(i in ip){print ip[i],i}}'|sort -nr|head
4.2.5 日志管理工具journalctl
前面介绍的日志查看过于分散,在centos7之后,利用systemd统一管理所有Uint的启动日志。使用journalctl命令即可管理所有日志信息(内核日志和用于日志)
命令格式:journalctl [OPTIONS...] [MATCHES...]
5. 案例
案例一:使用mysql存储日志信息
实现目标:利用rsyslog日志服务,将收集的日志信息存储于mysql中
将10.0.0.143的日志信息存在10.0.0.110主机的数据库中。
环境准备:centos 7 (10.0.0.143)----> cnetos8(10.0.0.110)
实现步骤:
1. 安装rsyslog-mysql数据库连接协议
[root@7143 ~]# yum install rsyslog-mysql #安装
[root@7143~]# rpm -ql rsyslog-mysql #查看生成的文件
2. 将安装生成的数据库文件传到数据库主机上(10.0.0.110)。
[root@7143~]# scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql 10.0.0.110:
3. 加载模块文件(/usr/lib64/rsyslog/ommysql.so),修改主配置文件/etc/rsyslog.conf文件。
[root@7143~]# vim /etc/rsyslog.conf 主配置文件的modules位置加载模块。centos8上面使用加载的方式:module(load="模块名" )
然后是定义规则(ROULES) *.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.116,Syslog,syslog,123456
4. 在10.0.0.110主机上,安装数据库,创建用户并授权。
[root@8116 ~]# yum install -y mysql-server #安装数据库
[root@8116 ~]#mysql < mysql-createDB.sql #导入传输过来的数据文件
[root@8116 ~]#mysql
mysql> create user syslog@'%' identified by '123456'; #创建用户
mysql> grant all on Syslog.* to syslog@'%' #授权
5.测试
使用logger命令可以测试
select * from Syslog.SystemEvents\G; 可便于查看
案例二:通过loganalyzer展示数据库中的日志
loganalyzer是php语言开发的日志管理系统,可以将数据库的日志以web方式来展示
官网:https://loganalyzer.adiscon.com
安装环境准备:需要下载loganalyzer包
实现步骤:
[root@7143 ~]# yum install rsyslog-mysql #安装连接数据库程序
[root@7143 ~]# rpm -ql rsyslog-mysql
[root@7143 ~]# scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql 10.0.0.116: 将安装时带的数据库文件传输到10.0.0.116主机上
[root@7143 ~]# vim /etc/rsyslog.conf 修改配置文件,
MODULES(加载模块):centos 7 使用$ModLoad模块名
centos8 使用module(load=模块名)
ROULES(定义规则):
*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.116,Syslog[数据库名],syslog[连接数据库账号],123456
10.0.0.116:安装数据库并创建账户及授权,导入数据文件
[root@8116 ~]# yum install -y mysql-server ;systemctl enable --now mysqld
[root@8116 ~]# mysql < mysql-createDB.sql
[root@8116 ~]# mysql #安装后哦默认空密码登录,账户是root
mysql> create user syslog@'%' identified by '123456';
mysql>grant all on Syslog.* to syslog@'%'
建议测试
10.0.0.117: 搭建web环境
[root@8117 ~]# yum install -y httpd php-fpm php-mysqlnd php-gd ;systemctl enable --now httpd
[root@8117 ~]#crul http://10.0.0.117 测试。也可以使用浏览器测试
[root@8117 ~]#tar xf loganalyzer-4.1.11.tar.gz -C /var/www/html/ 将下载的loganalyzer文件解压到/var/www/html目录下
[root@8117 ~]#chown -R apache.apache /var/www/html/src/ 修改权限,因为文件的写入时使用apache用户的身份(只是安装结束后一需要修改config.php文件的权限)。
也可以使用解压文件中的方法(解压文件下的contrib目录下), touch config.php ;chmod 666 config.php
浏览器测试:http://10.0.0.117/src
然后下一步.... 总共有7步
只是在第7步时,需要有变化。
source type mysql native
database host Syslog
database name SystemEvents
database user syslog
database password 123456
最后测试(logger ”string“),省略
6. logrotate 日志转储
logrorate程序是一个人日志文件管理工具。用来把就得日志删除,并创建新得日志文件,该过程就叫做日志得转储或滚动
转储的条件可以根据文件的带下,也可以根据定义的时间段(天,周,月)来转储,该过程是通过cron程序来实现的
软件包:logrotate
相关文件
/etc/cron.daily/logrotate 计划任务
/usr/sbin/logrotate 程序文件
/etc/logrotate.conf 配置文件(系统默认转储条件)
/var/lib/logrotate/logrotate.status 日志文件
配置文件主要的参数:
compress | nocompress 是否启用压缩,默认是gzip压缩
copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate:备份日志但不截断
create mode owner group :转储文件,使用指定的权限,所有者,所属组创建新的日志文件
nocreate:不创建新的日志文件
delaycompress:延迟压缩,通常和compress一起使用。准出的日志文件到下一次转储是才压缩
nodelaycompress:覆盖delaycompress选项,转储时同时压缩
errors address:转储时的错误发送到指定的有点地址
ifempty:即使时空文件也转储,词尾默认选项
noifempty:如果是空文件就不转储
mail address:把转储时的日志文件发送到指定的邮件中
nomail 转储时不发生日志文件
olddir directory :转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir :转储后的日志文件和当前日志文件放在一个目录下
prerotate/endscript:在转储以前需要执行的命令,注意;两个关键字需要单独成行
postrotate/endscript :在转储之后需要之心的命令,注意;两个关键字需要单独成行
daily:指定转储周期,天
weekly:指定转储周期,周
monthly:指定转储周期,月
rotate count :指定日志文件删除之前转储的次数,0表示没有备份,#表示指定保留#个备份
tabooext [+] list:让logtotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和 ~
size size :当日志文件到达指定的大小时才转储,bytes(缺省)及KB或MB
missingok:如果日志文件不存在,不提示错误,继续处理下一个
nomissingok:如果日志不存在,提示错误,此为默认值
sharedscripts:对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/ var / log / news /*.example)。 如果指定此项sharedscripts,则无论有多少个日志与通配符模式匹配,脚本都只会运行一次
nosharedscripts 针对每一个转储的日志文件,都执行一次prerotate 和 postrotate脚本,此为默认值
范例1 :设置nginx的日志转储
cat /etc/logrotate.d/nginx
var/log/nginx/*.log {
daily
rotate 100
missingok
compress
delaycompress
notifempty
create 644 ngnix nginx
postrotate
if [ -f /app/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /app/nginx/logs/nginx.pid` #让nginx进程重读日志文件。USER1 相当于发送了respone之心
fi
endscript
}
范例2:对指定的日志手动执行日志转储
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
针对不同的日志创建转储配置文件
cat /etc/logrotate.d/test1
/var/log/test1.log{
daily
rotate 2
compress
delaycompress
missingok
size 1M
notifempty
create 640 bin nobody
postrotate
echo `date +%F_%T` >>/data/test1,log
endscript
}
针对一个测试日志,手动执行日志转储
logrotate /etc/logrotate.d/test1
或执行总的转储配置文件
logrotate /etc/logrotate.conf