一、实训目的
1、掌握Linux Syslog日志推送的配置方法;
2、掌握基于Logstash实现Linux Syslog日志清洗;
3、掌握基于Kibana实现Linux Syslog日志的可视化分析。
二、实训学时
4学时
三、实训类型
综合性
四、实训需求
1、硬件
每人配备计算机 1 台。
2、软件
安装Edge、Firefox、Chrome等最新版本浏览器,安装Mobaxterm软件。
3、网络
本地主机能够访问教学云计算平台,虚拟机按照配置指南配置网络。
4、工具
无。
五、实训任务
1、完成Linux Syslog日志推送的配置;
2、完成Linux Syslog日志的清洗;
3、完成Linux Syslog日志的可视化分析。
六、实训环境
1、本实训需要VM 1台,操作系统使用openEuler 24.03 LTS SP1。
2、本实训VM配置信息如下表所示。
| 虚拟机配置 | 操作系统配置 |
|---|---|
| 虚拟机名称:Labs-ELK-VM-102内存:2GBCPU:1颗,2核心虚拟磁盘:50GB网卡:1块 | 主机名:Labs-ELK-VM-102IP地址:10.10.2.102子网掩码:255.255.255.0网关:10.10.2.1DNS:10.10.3.70 |
📌注意:虚拟机名称、主机名称均需要按照实训课提供的实训指南中实训环境进行配置,虚拟机网络请根据自身实验环境进行配置,请勿完全按照实训环境进行配置。
七、实训内容及步骤
1、创建虚拟机
根据本实训指南中实训环境提供的配置规划完成虚拟机创建,虚拟机创建的详细步骤请参考《实训指南01:部署Elastic Stack》的实训内容及步骤。
2、配置Syslog推送Linux 日志
(1)在主机Labs-ELK-VM-102上关闭SELinux,参考命令如下。
# 临时关闭SELinux
[root@Labs-ELK-VM-102 ~]# setenforce 0
# 永久禁用SELinux
[root@Labs-ELK-VM-102 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
(2)在主机Labs-ELK-VM-102上修改rsyslog配置文件/etc/rsyslog.conf,配置将所有info及以上级别的日志,通过TCP协议发送到远程主机10.10.2.101的5044端口,参考命令如下。
# 修改rsyslog配置文件
[root@Labs-ELK-VM-102 ~]# vi /etc/rsyslog.conf
---------------/etc/rsyslog.conf---------------
# 再配置文件末尾添加以下行,将所有info及以上级别的日志发送到10.10.2.101的5044端口
*.info @@10.10.2.101:5044
---------------/etc/rsyslog.conf---------------
📌小贴士
rsyslog是Linux系统上一种高性能日志处理工具,用于收集、传输和处理日志消息。它支持灵活的配置选项,能够将日志发送到多种目的地,如文件、远程服务器或数据库,提供可靠的日志管理和分析解决方案。
(1)rsyslog定义转发规则:*.info @@10.10.2.101:5044
- *:表示匹配所有日志设施(facility),如 auth、kern、cron 等。
- .info:表示记录info级别及更高优先级(如 warning、error)的日志。
- @@:表示使用TCP协议,单@表示UDP协议。
- 10.10.2.101: 目标服务器的IP地址。
- 5044:目标服务器监听的端口。
(2)Syslog Severity Levels
- 0-EMERGENCY:系统不可用,需立即处理(紧急)
- 1-ALERT:需立即采取行动的严重问题(警报)
- 2-CRITICAL:关键错误,可能导致服务中断(严重)
- 3-ERROR:非致命错误,影响部分功能(错误)
- 4-WARNING:潜在问题,需关注但未影响服务(警告)
- 5-NOTICE:正常但重要的事件(通知)
- 6-INFORMATIONAL:详细状态信息(信息)
- 7-DEBUG:开发阶段的详细日志(调试)
(3)修改完成重启rsyslog服务使配置生效,参考命令如下。
[root@Labs-ELK-VM-102 ~]# systemctl restart rsyslog
3、使用Logstash进行 Linux Syslog日志清洗
(1)在主机Labs-ELK-VM-101上修改容器labs-elk-logstash01的配置文件/data/docker/volumes/labs-elk-logstash01-pipeline/_data/logstash.conf配置logstash输入,使用syslog采集管道解析模块收集的数据,参考命令如下。
#修改Logstash配置文件
[root@Labs-ELK-VM-101 ~]# vi /data/docker/volumes/labs-elk-logstash01-pipeline/_data/logstash.conf
# 指定Logstash监听5044端口并接收syslog格式的日志数据作为输入
----------------------logstash--------------------
input {
syslog {
port => 5044
}
}
--------------------------------------------------
📌 小贴士:
在主机Labs-ELK-VM-101上创建Logstash容器时,定义了将容器
labs-elk-logstash01的配置文件所在目录/usr/share/logstash/pipeline挂载到本地存储卷labs-elk-logstash01-pipeline。Docker容器的存储卷存储位置为:Docke数据目录/volumes/存储卷名称/_data
(2)在主机Labs-ELK-VM-101上修改容器labs-elk-logstash01的配置文件,配置过滤器清洗日志,参考命令如下。
#修改Logstash配置文件
[root@Labs-ELK-VM-101 ~]# vi /data/docker/volumes/labs-elk-logstash01-pipeline/_data/logstash.conf
# 确定日志清洗字段,使用Ruby插件来处理事件,并对事件进行处理和修改,使用mutate插件添加新字段
----------------------logstash--------------------
filter {
# 使用mutate插件添加新字段
mutate {
add_field => {"prival" => "%{[log][syslog][priority]}"}
add_field => {"facility" => "%{[log][syslog][facility][code]}"}
add_field => {"facility_label" => "%{[log][syslog][facility][name]}"}
add_field => {"severity" => "%{[log][syslog][severity][code]}"}
add_field => {"severity_label" => "%{[log][syslog][severity][name]}"}
add_field => {"hostname" => "%{[host][hostname]}"}
add_field => {"hostip" => "%{[host][ip]}"}
add_field => {"server_ip" => "%{[host][ip]}"}
add_field => {"app_name" => "%{[process][name]}"}
add_field => {"procid" => "%{[process][pid]}"}
}
# 将时间戳调整为东八区时间
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime - 8*60*60)"
}
ruby {
code => "event.set('log_time', event.get('timestamp'))"
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
# 使用 Ruby 插件将 @timestamp 字段的值复制到新的 log_time 字段中,
# 并将该时间戳解析为 Ruby 的 Time 对象
ruby {
code => "
require 'time'
timestamp = event.get('log_time').to_s
# 将时间戳转换为 Time 对象
time = Time.parse(timestamp) + 8*60*60
# 获取年月日时分秒
year = time.year
month = time.month
day = time.day
hour = time.hour
minute = time.min
second = time.sec
weekday = time.wday
yearday = time.yday
timezone = time.zone
# 将结果存储到新字段中
event.set('[log_time_arr][year]', year)
event.set('[log_time_arr][month]', month)
event.set('[log_time_arr][day]', day)
event.set('[log_time_arr][hour]', hour)
event.set('[log_time_arr][min]', minute)
event.set('[log_time_arr][sec]', second)
event.set('[log_time_arr][wday]', weekday)
event.set('[log_time_arr][yday]', yearday)
event.set('[log_time_arr][time_zone]', timezone)
"
}
# 获取user_name
if [facility]=="10" {
if "USER=" in [message]{
grok {
match => { "message" => "USER=%{WORD:user_name}" }
}
}
if "user " in [message]{
grok {
match => { "message" => "user %{WORD:user_name}" }
}
}
if "Accepted password for " in [message]{
grok {
match => { "message" => "Accepted password for %{WORD:user_name}" }
}
}
}
}
-----------------------------------------------
📌 小贴士:
Logstash配置中的
filter作为数据处理管道的核心环节,承担着解析、转换、丰富与过滤原始输入数据(如日志)的关键职能,本质上是将非结构化数据转化为标准化、可分析的结构化格式的“数据加工厂”。作为Logstash管道中的中间处理设备,过滤器通过与条件语句协同工作,可依据特定业务标准(例如Linux Syslog日志字段清洗规则,如表3-1所示)对满足条件的事件执行精细化操作,包括字段提取、类型转换、无效数据剔除等,最终实现数据价值的深度挖掘与存储优化。其设计目标在于提升数据可用性、保障分析效率,并为下游存储与分析系统(如Elasticsearch)提供高质量的结构化数据输入。
表 3-1 Linux Syslog日志字段清洗标准
| 日志字段 | 清洗字段 | 字段说明 | 字段格式 |
|---|---|---|---|
| log.syslog.priority | prival | 优先级 | int |
| log.syslog.facility.code | facility | 来源码 | string |
| log.syslog.facility.name | facility_label | 日志来源 | string |
| log.syslog.severity.code | severity | 严重码 | string |
| log.syslog.severity.name | severity_label | 严重等级 | string |
| @timestamp | log_time | 时间戳 | date |
| log_time_arr.year | 时间戳-年 | integer | |
| log_time_arr.month | 时间戳-月 | integer | |
| log_time_arr.day | 时间戳-日 | integer | |
| log_time_arr.hour | 时间戳-时 | integer | |
| log_time_arr.min | 时间戳-分 | integer | |
| log_time_arr.sec | 时间戳-秒 | integer | |
| log_time_arr.yday | 时间戳-一年中的第几天 | integer | |
| log_time_arr.wday | 时间戳-周几 | integer | |
| log_time_arr.time_zone | 时间戳-时区 | string | |
| host.hostname | hostname | 主机名 | string |
| host.ip | hostip | 主机地址 | string |
| process.name | app_name | 应用名 | string |
| process.pid | procid | 进程id | string |
| message | message | 日志内容 | string |
| message | user_name | 用户 | string |
(3)在主机Labs-ELK-VM-101上修改容器labs-elk-logstash01的配置文件,配置输出模块为Elasticsearch,参考命令如下。
# Logstash将处理后的日志数据输出到Elasticsearch中进行存储、索引和检索
----------------------logstash.conf输出插件--------------------
output {
elasticsearch {
# Elasticsearch节点的用户名和密码
user => "elastic"
password => "Labs#ELK@2025"
# Elasticsearch 的主机地址和端口
hosts => ["https://labs-elk-es-node-1:9200"]
# 将数据写入 Elasticsearch 时的索引名称
index => "labs-elk-linux-%{+YYYY.MM.dd}"
# Logstash 使用的 CA 证书的路径
ssl_certificate_authorities => ["/usr/share/logstash/config/certs/ca/ca.crt"]
}
# 添加输出至控制台以便检测是否推送成功
stdout {codec => rubydebug}
}
----------------------logstash.conf输出插件--------------------
(4)在主机Labs-ELK-VM-101上修改Elasticsearch生成的证书目录权限,参考命令如下。
#给予labs-elk-certs及其目录下所有文件777权限
[root@Labs-ELK-VM-101 ~]# chmod -R 777 /data/docker/volumes/labs-elk-certs
(5)在主机Labs-ELK-VM-101上,重启容器labs-elk-logstash-1,通过docker logs命令查看日志的推送情况,验证完成后修改logstash配置文件,禁用输出到控制台,并重启容器labs-elk-logstash-1,参考命令如下。
# 重启Logstash容器
[root@Labs-ELK-VM-101 ~]# docker restart labs-elk-logstash-1
# 查看 Linux Syslog日志的推送清洗情况
[root@Labs-ELK-VM-101 ~]# docker logs -f labs-elk-logstash-1
#此处省略部分日志内容
{
"process" => {
"name" => "sshd",
"pid" => 1603
},
"server_ip" => "10.10.2.102",
"service" => {
"type" => "system"
},
"hostname" => "Labs-ELK-VM-102",
"severity_label" => "Informational",
"log_time" => 2025-08-11T08:40:56.000Z,
"timestamp" => 2025-08-11T08:40:56.000Z,
"prival" => "38",
"log" => {
"syslog" => {
"facility" => {
"code" => 4,
"name" => "security/authorization"
},
"priority" => 38,
"severity" => {
"code" => 6,
"name" => "Informational"
}
}
},
"severity" => "6",
"log_time_arr" => {
"time_zone" => "UTC",
"yday" => 223,
"hour" => 16,
"year" => 2025,
"day" => 11,
"wday" => 1,
"min" => 40,
"month" => 8,
"sec" => 56
},
"message" => "Close session: user root from 10.10.0.1 port 52342 id 2\n",
"facility" => "4",
"@timestamp" => 2025-08-11T08:40:56.000Z,
"app_name" => "sshd",
"facility_label" => "security/authorization",
"hostip" => "10.10.2.102",
"event" => {
"original" => "<38>Aug 11 16:40:56 Labs-ELK-VM-102 sshd[1603]: Close session: user root from 10.10.0.1 port 52342 id 2\n"
},
"@version" => "1",
"host" => {
"hostname" => "Labs-ELK-VM-102",
"ip" => "10.10.2.102"
}
}
# 验证完成后修改logstash配置文件,关闭输出到控制台
[root@Labs-ELK-VM-101 ~]# vi /data/docker/volumes/labs-elk-logstash01-pipeline/_data/logstash.conf
----------------------logstash--------------------
# 此处省略其他配置内容
# stdout {codec => rubydebug}
--------------------------------------------------
# 重启logstash容器
[root@Labs-ELK-VM-101 ~]# docker restart labs-elk-logstash-1
4、使用Kibana检索日志
4.1 创建数据视图
(1)使用浏览器访问Kibana地址http://10.10.2.101:5601,输入用户和密码(用户名:elastic,密码:Labs#ELK@2025)登录Kibana,如图3-1所示。
(2)在Kibana的欢迎页面,单击【Explore on my own】进入系统主页面,单击左上角的三条横线,导航到左侧菜单,下滑选择“Management”选项卡中“Stack Management”选项,如图3-2所示。
(3)在“Stack Management”页面,选择“Kibana”选项卡中“Data Views”选项,创建和管理数据视图,如图3-3所示。
(4)单击“Data Views”,在数据视图页面中单击【Create data view】,创建Linux Syslog日志的数据视图。如图3-4所示。
(5)输入视图名称为“labs-elk-linux”,索引模式为“labs-elk-linux-*”,Timestamp字段选择默认值“@timestamp”,单击【Save data view to Kibana】,保存视图配置,如图3-5、3-6所示。
📌小贴士:
在显示高级设置(Show advanced settings)中可以设置“显示隐藏索引和系统索引”,指定自定义的数据视图名称。
(6)单击左上角导航栏,选择“Analytics”选项卡中“Discover”选项,进入日志分析视图页面。在左上角选择“labs-elk-linux”的数据视图,点击“Search entire time range”检索查看Linux Syslog日志,如图3-7所示。
(7)查看左侧字段列表,单击左侧Available fields中【+】,可对Linux Syslog日志中的字段日志进行检索查看,如图3-8所示。
4.2 基于功能检索日志
(1)基于时间范围和日志字段检索日志,制定如下日志检索场景,如表3-2所示。
| 序号 | 检索方式 | 场景描述 |
|---|---|---|
| 场景1 | 基于时间范围 | 查询最近24小时Linux Syslog日志数据及日志量 |
| 场景2 | 查询时间范围在2025-08-15 00:00:00到2025-08-18 12:00:00的Linux Syslog日志数据及日志量 | |
| 场景3 | 基于时间范围+日志字段 | 查询时间范围在2025-08-18 00:00:00到2025-08-19 00:00:00,且日志严重等级为“Error”的Linux Syslog日志数据 |
| 场景4 | 查询最近7天,应用名为“python3”且主机名为“Labs-ELK-VM-102”的Linux Syslog日志数据 |
场景1: 查询最近24小时Linux Syslog日志数据及日志量
在Kibana日志发现页面,左上角Date View选择“labs-elk-linux”,右上角设置时间范围,选择Commonly used中的“Last 24 hours”,单击【Refresh】查询最近24小时Linux Syslog日志,如图3-9所示。
📌
Kibana检索日志设置时间范围提供了以下常用(Commonly used)选项:
- Today:选择从今天午夜 (00:00:00) 开始,到当前时刻结束的时间范围。
- This week:选择从本周第一天 (默认为周日) 的午夜 (00:00:00) 开始,到当前时刻结束的时间范围。
- Last 1 minute:选择从当前时刻往前推1分钟开始,到当前时刻结束的时间范围。
- Last 15 minutes:选择从当前时刻往前推 15 分钟开始,到当前时刻结束的时间范围。
- Last 30 minutes:选择从当前时刻往前推 30 分钟开始,到当前时刻结束的时间范围。
- Last 1 hour:选择从当前时刻往前推 1 小时开始,到当前时刻结束的时间范围。
- Last 24 hours:选择从当前时刻往前推 24 小时开始,到当前时刻结束的时间范围。
- Last 7 days:选择从当前时刻往前推 7 天开始,到当前时刻结束的时间范围。
- Last 30 days: 选择从当前时刻往前推 30 天开始,到当前时刻结束的时间范围。
- Last 90 days:选择从当前时刻往前推 90 天开始,到当前时刻结束的时间范围。
- Last 1 year:选择从当前时刻往前推 365 天开始,到当前时刻结束的时间范围。(注意:Kibana不区分闰年,通常按365天计算)。
场景2: 查询时间范围在2025-08-15 00:00:00到2025-08-18 12:00:00的Linux Syslog日志数据及日志量
在Kibana日志发现页面,左上角Date View选择“labs-elk-linux”,右上角设置时间范围,开始时间选择“Absolute”设置为“Aug 15, 2025 @ 00:00:00.000”;结束时间选择“Absolute”设置为“Aug 18, 2025 @ 12:00:00.000”,单击【Refresh】检索上述条件下的Linux Syslog日志,如图3-10所示。
场景3: 查询时间范围在2025-08-18 00:00:00到2025-08-19 00:00:00,且日志严重等级为“Error”的Linux Syslog日志数据
在Kibana日志发现页面,左上角Date View选择“labs-elk-linux”
① 右上角设置时间范围,开始时间选择“Absolute”设置为“Aug 18, 2025 @ 00:00:00.000”;结束时间选择“Absolute”设置为“Aug 19, 2025 @ 00:00:00.000”
② 单击页面上方【+】添加过滤条件:设置字段“severity_label”的值为“Error”单击【Add filter】,如图3-11所示。
单击【Refresh】检索上述条件下的Linux Syslog日志,如图3-12所示。
场景4: 查询最近7天,应用名为“python3”且主机名为“Labs-ELK-VM-102”的Linux Syslog日志数据
在Kibana日志发现页面,左上角Date View选择“labs-elk-linux”
① 右上角设置时间范围,选择Commonly used中的“Last 7 days”
② 单击页面上方【+】添加过滤条件:设置字段“app_name”的值为“python3”且字段“hostname”的值为“Labs-ELK-VM-102”,单击【Add filter】,如图3-13所示。
单击【Refresh】检索上述条件下的Linux Syslog日志,如图3-14所示。
4.3 基于Elasticsearch SQL检索日志
(1)基于Elasticsearch SQL定义查询条件检索日志,制定如下日志检索场景,如表3-3所示。
| 序号 | 检索方式 | 场景描述 |
|---|---|---|
| 场景5 | 基于Elasticsearch SQL | 检索生产环境中所有紧急(emerg)、告警(alert)、严重(crit)和错误(err)级别的日志,实时展示最新20条记录,帮助运维团队快速响应系统故障 |
| 场景6 | 分析特定主机(主机名:Labs-ELK-VM-102)24小时内包含"failed"或"error"关键词的日志,按应用名称统计异常次数,识别问题根源 |
场景5: 检索生产环境中所有紧急(emerg)、告警(alert)、严重(crit)和错误(err)级别的日志,实时展示最新20条记录,帮助运维团队快速响应系统故障。
在Kibana日志发现页面,单击【Try ES|QL】进入Elasticsearch SQL日志检索页面,基于场景描述制定相应的Elasticsearch SQL语句,如下所示。
FROM labs-elk-linux-* //从所有匹配的索引读取
| WHERE severity_label IN ("Emergency", "Alert", "Critical", "Error") //过滤高优先级日志
| KEEP log_time, hostname, severity_label, app_name, message //保留关键字段
| SORT log_time DESC //按时间倒序排列
| LIMIT 20 //返回最新20条
在Elasticsearch SQL日志检索页面输入上述制定的Elasticsearch SQL语句,单击【Run】检索日志,如图3-15所示。
单击【Save】保存日志发现会话,设置Title为“Linux Syslog高优先级日志实时监控”,Description为场景描述内容,创建tag名称为“Linux Syslog”,如图3-16所示。
场景6: 分析特定主机(主机名:Labs-ELK-VM-102)24小时内包含"failed"或"error"关键词的日志,按应用名称统计异常次数,识别问题根源。
在Kibana日志发现页面,单击【Try ES|QL】进入Elasticsearch SQL日志检索页面,基于场景描述制定相应的Elasticsearch SQL语句,如下所示。
FROM labs-elk-linux-*
| WHERE
hostname == "Labs-ELK-VM-102" //指定主机名称
AND log_time >= NOW() - 1 DAY //24小时时间范围
AND message RLIKE ".*(failed|error)*." //错误关键词
| STATS count = COUNT(*) BY app_name // 按应用名称统计异常次数
| SORT count DESC //按次数降序排列
在Elasticsearch SQL日志检索页面输入上述制定的Elasticsearch SQL语句,单击【Run】检索日志,如图3-17所示。
单击【Save】保存日志发现会话,设置Title为“Linux主机异常行为分析”,Description为场景描述内容,选择tag名称为“Linux Syslog”,如图3-18所示。
5、Linux Syslog日志可视化分析
(1)通过 Linux Syslog日志字段清洗标准建立日志分析模型,实现 Linux Syslog日志可视化分析。 Linux Syslog日志分析模型如表3-4所示。
表 3-4 Linux Syslog日志分析模型
| 分类 | 分析模型 | 图表类型 | 分析模型用途 |
|---|---|---|---|
| 概览 | 日志总量 | 数字 | 展示日志总量 |
| 日志来源 | 标签云 | 展示日志来源关键字 | |
| 日志趋势 | 折线图 | 展示日志量随时间的变化趋势 | |
| 24小时日志统计 | 柱状图 | 展示每小时的日志量 | |
| 日志来源 | 日志来源排行 | 表格 | 展示主机日志来源排行,日志量 |
| 日志来源占比 | 饼状图 | 展示日志来源占比 | |
| 日志来源趋势 | 折线图 | 展示不同日志来源随时间的变化趋势 | |
| 日志等级 | 日志等级排行 | 表格 | 展示主机日志等级排行,日志量 |
| 日志等级占比 | 饼状图 | 展示日志等级占比 | |
| 日志等级趋势 | 折线图 | 展示警告、错误、信息、成功审计、故障审计随时间的变化趋势 | |
| 日志进程 | 日志总进程数 | 数字 | 展示系统日志进程总数量 |
| 日志进程数排行 | 表格 | 展示系统日志进程数排行 | |
| 日志进程数占比 | 饼状图 | 展示系统日志进程数占比 | |
| 不同日志进程趋势 | 折线图 | 展示不同进程随系统日志时间变化趋势 | |
| 访问主机 | 访问主机数 | 数字 | 展示交互的主机数 |
| 访问主机ip | 表格 | 展示交互的主机ip次数排行 | |
| 访问主机ip占比 | 饼状图 | 展示交互的主机ip次数占比 | |
| 日志优先级 | 日志优先级排行 | 表格 | 展示主机日志优先级排行,日志量 |
| 日志优先级占比 | 饼状图 | 展示日志优先级占比 |
(2)通过Kibana的可视化图表功能,绘制上述日志分析模型,如图3-9所示。