日志服务管理和文件共享服务

  • 日志服务管理和文件共享服务已关闭评论
  • 151 次浏览
  • A+
所属分类:linux技术
摘要

CentOS 5 之前版本采用的日志管理系统服务 rsyslog是CentOS 6 以后版本的系统管理服务.它提供了高性能,出色的安全性和模块化设计。 尽管rsyslog最初是常规的syslogd,但已发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。


一、系统日志管理

1 系统日志介绍

1.1 sysklogd 系统日志服务

CentOS 5 之前版本采用的日志管理系统服务

  • klogd: linux kernel 记录内核日志
  • syslogd: system application 记录应用日志

 

1.2 rsyslog 系统日志服务

rsyslog是CentOS 6 以后版本的系统管理服务.它提供了高性能,出色的安全性和模块化设计。 尽管rsyslog最初是常规的syslogd,但已发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。

当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。 即使在远程的目的地和更精细的处理中,性能通常也被认为是“惊人的”。

 

1.3 ELK

ELK:由Elasticsearch, Logstash, Kibana三个软件组成

  • 非关系型分布式数据库
  • 基于apache软件基金会jakarta项目组的项目lucene
  • Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能
  • Logstash对日志进行收集、分析,过滤,并将其存储供以后使用
  • Kibana 可以提供的日志分析友好的 Web 界面

 


2 rsyslog 管理

2.1 系统日志术语

  • facility 设施:从功能或程序上对日志进行归类
#内置分类 auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth),user, uucp, syslog  #自定义的分类 local0-local7
  • Priority 优先级别:从低到高排序
debug,info, notice, warn(warning), err(error), crit(critical), alert,emerg(panic)
  • logger 命令:可在系统日志中输入消息
#范例 [root@rsyslog ~]# logger "this is a test log" [root@rsyslog ~]# cat /var/log/messages Nov  8 03:30:05 rsyslog root[2127]: this is a test log

 

2.2 rsyslog 相关文件

  • 程序包:rsyslog
  • 主程序:/usr/sbin/rsyslogd
  • CentOS 6:/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
  • CentOS 7,8:/usr/lib/systemd/system/rsyslog.service
  • 配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
  • 库文件: /lib64/rsyslog/*.so

 

2.3 rsyslog配置文件

/etc/rsyslog.conf 配置文件格式:由三部分组成

  • MODULES:相关模块配置
  • GLOBAL DIRECTIVES:全局配置
  • RULES:日志记录相关的规则配置

RULES配置格式

facility.priority; facility.priority…  target

facility格式

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

priority格式

*: 所有级别 none:没有级别,即不记录 PRIORITY:指定级别(含)以上的所有级别 =PRIORITY:仅记录指定级别的日志信息

target格式

  • 文件路径:通常在/var/log/,文件路径前的-表示异步写入
  • 用户:将日志事件通知给指定的用户,* 表示登录的所有用户
  • 日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
  • 管道: | COMMAND,转发给其它命令处理

通常的日志文件的格式

日志文件有很多,如: /var/log/messages,cron,secure等,基本格式都是类似的。格式如下

事件产生的日期时间 主机 进程(pid):事件内容

 

范例:将ssh服务的日志记录至自定义的local的日志设备
#修改sshd服务的配置 [root@rocky01 ~]# vim /etc/ssh/sshd_config #SyslogFacility AUTHPRIV #更改此行 SyslogFacility local6  #修改rsyslog的配置 [root@rocky01 ~]# vim /etc/rsyslog.d/sshd.conf local6.* /var/log/sshd.log  [root@rocky01 ~]# systemctl reload sshd [root@rocky01 ~]# systemctl restart rsyslog.service  #测试 #ssh登录后,查看/var/log/sshd.log有记录 [root@rocky01 ~]# tail -f /var/log/sshd.log Nov  7 16:26:12 rocky01 sshd[3903]: Accepted password for root from 10.0.0.1 port 51367 ssh2

 

 

2.4 启用网络日志服务

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

端口:514

范例:CentOS 8 启用网络日志功能

#接收日志的服务器 [root@rocky01 ~]# vim /etc/rsyslog.conf #udp和tcp开启一个即可(同网段UDP,不同网段TCP) ## MODULES #### ...省略... # 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")  [root@rocky01 ~]# systemctl restart rsyslog  #在客户端指定将日志发送到远程的TCP、UDP的日志服务器 #一个@是UDP,两个@@是TCP [root@rocky02 ~]# vim /etc/rsyslog.conf *.info;mail.none;authpriv.none;cron.none /var/log/messages *.info;mail.none;authpriv.none;cron.none @@10.0.0.8:514 #TCP *.info;mail.none;authpriv.none;cron.none @10.0.0.8:514 #UDP [root@rocky02 ~]# systemctl restart rsyslog

 

2.5 常见日志文件

/var/log/secure:系统安全日志,文本格式,应周期性分析

/var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看

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

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

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

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

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

/var/log/anaconda : anaconda的日志

 


3 journalctl 日志管理工具 

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

日志的配置文件:

/etc/systemd/journald.conf

journalctl命令格式:

journalctl [OPTIONS...] [MATCHES...]

范例:journalctl用法

#查看所有日志(默认情况下 ,只保存本次启动的日志) journalctl  #查看内核日志(不显示应用日志) journalctl -k  #查看系统本次启动的日志 journalctl -b journalctl -b -0  #查看上一次启动的日志(需更改设置) journalctl -b -1  #查看指定时间的日志 journalctl --since="2017-10-30 18:10:30" journalctl --since "20 min ago" journalctl --since yesterday journalctl --since "2017-01-10" --until "2017-01-11 03:00" journalctl --since 09:00 --until "1 hour ago"  #显示尾部的最新10行日志 journalctl -n  #显示尾部指定行数的日志 journalctl -n 20  #实时滚动显示最新日志 journalctl -f  #查看指定服务的日志 journalctl /usr/lib/systemd/systemd  #查看指定进程的日志 journalctl _PID=1  #查看某个路径的脚本的日志 journalctl /usr/bin/bash  #查看指定用户的日志 journalctl _UID=33 --since today

 


二、实战案例:利用 MySQL 存储日志信息

目标

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

环境准备

  • 两台主机
  • 10.0.0.128:rsyslog日志服务器
  • 10.0.0.130:mysql数据库服务器

注:可配合网络日志功能

(1)在rsyslog服务器上安装连接mysql模块相关的程序包

[root@rsyslog ~]# yum install -y rsyslog-mysql #mysql-createDB.sql需导入到数据库服务器 [root@rocky01 ~]# rpm -ql rsyslog-mysql /usr/lib/.build-id /usr/lib/.build-id/09 /usr/lib/.build-id/09/927b14f8ca6dfdeca2c2bbe1369b56e6470382 /usr/lib64/rsyslog/ommysql.so /usr/share/doc/rsyslog/mysql-createDB.sql  #将sql脚本复制到数据库服库上 [root@rsyslog ~]# scp /usr/share/doc/rsyslog/mysql-createDB.sql 10.0.0.130:/data

(2)准备MySQL Server

[root@mysql ~]# yum install -y mysql-server #在mariadb数据库服务器上创建相关数据库和表,并授权rsyslog能连接至当前服务器 #Syslog库为mysql-createDB.sql里所创建的库,创建的用户名可自定义 [root@mysql ~]# mysql 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.%';

(3)配置日志服务器将日志发送至指定数据库

#配置rsyslog将日志保存到mysql中 [root@rsyslog ~]# vim /etc/rsyslog.conf # ####MODULES#### #在 MODULES 语言下面,如果是 CentOS 8 加下面行 module(load="ommysql") #在 MODULES 语言下面,如果是 CentOS 7,6 加下面行 $ModLoad ommysql  #在RULES语句块加下面行的格式 #分类可自行修改 *.info;mail.none;authpriv.none;cron.none                /var/log/messages *.info;mail.none;authpriv.none;cron.none                :ommysql:10.0.0.130,Syslog,rsyslog,123456  [root@rsyslog ~]# systemctl restart rsyslog

(4)测试

#在日志服务器上生成日志 [root@rsyslog ~]# logger "this is a test log"  #在数据库上查询到上面的测试日志 [root@mysql ~]# mysql Syslog mysql> select * from SystemEventsG *************************** 1. row ***************************                 ID: 1         CustomerID: NULL         ReceivedAt: 2022-11-08 02:27:49 DeviceReportedTime: 2022-11-08 02:27:49           Facility: 1           Priority: 5           FromHost: rsyslog            Message: this is a test log ...省略...

 


三、logrotate 日志转储

1 logrotate 介绍

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行

 

2 logrotate 配置

软件包:logrotate

相关文件

  • 计划任务:/etc/cron.daily/logrotate
  • 程序文件:/usr/sbin/logrotate
  • 配置文件: /etc/logrotate.conf
  • 日志文件:/var/lib/logrotate/logrotate.status

配置文件主要参数如下:

配置参数 说明
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 如果日志不存在,提示错误,此为默认值

 

3 logroate 配置范例

范例: 设置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`         fi     endscript }

范例:对指定日志手动执行日志转储

#生成测试日志 [root@centos8 ~]#dd if=/dev/zero of=/var/log/test1.log bs=2M count=1 [root@centos8 ~]#dd if=/dev/zero of=/var/log/test2.log bs=2M count=1  #针对不同的日志创建转储配置文件 [root@centos8 ~]#cat /etc/logrotate.d/test1 /var/log/test1.log {     daily     rotate 5     compress     delaycompress     missingok     size 1M     notifempty     create 640 bin nobody     postrotate         echo `date +%F_%T` >> /data/test1.log     endscript }  [root@centos8 ~]#cat /etc/logrotate.d/test2 /var/log/test2.log {     daily     rotate 5     compress     delaycompress     missingok     size 1M     notifempty     create 644 root root     postrotate         echo `date +%F_%T` >> /data/test2.log     endscript }  #针对一个测试日志,手动执行日志转储 [root@centos8 ~]#logrotate /etc/logrotate.d/test1 [root@centos8 ~]#ll /var/log/test* -rw-r----- 1 root root 0 Dec 14 16:38 /var/log/test1.log -rw-r--r-- 1 root root 2097152 Dec 14 16:35 /var/log/test1.log.1 -rw-r--r-- 1 root root 2097152 Dec 14 16:36 /var/log/test2.log [root@centos8 ~]#ls /data test1.log [root@centos8 ~]#cat /data/test1.log 2019-11-12_14:00:14  #对所有日志进行手动转储 [root@centos8 ~]#logrotate /etc/logrotate.conf [root@centos8 ~]#ll /var/log/test* -rw-r--r-- 1 bin nobody 0 Nov 12 14:00 /var/log/test1.log -rw-r--r-- 1 root root 2097152 Nov 12 13:59 /var/log/test1.log.1 -rw-r--r-- 1 root root 0 Nov 12 14:01 /var/log/test2.log -rw-r--r-- 1 root root 2097152 Nov 12 13:59 /var/log/test2.log-20191112  [root@centos8 ~]#ls /data test1.log test2.log [root@centos8 ~]#cat /data/test1.log 2019-11-12_14:01:51