智慧医院智能运维实训指导书-实训指南02:实现Linux Syslog日志分析

664 阅读17分钟

一、实训目的

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.priorityprival优先级int
log.syslog.facility.codefacility来源码string
log.syslog.facility.namefacility_label日志来源string
log.syslog.severity.codeseverity严重码string
log.syslog.severity.nameseverity_label严重等级string
@timestamplog_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.hostnamehostname主机名string
host.iphostip主机地址string
process.nameapp_name应用名string
process.pidprocid进程idstring
messagemessage日志内容string
messageuser_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所示。