基于 ELK 部署单机版日志系统方案

ELK(Elasticsearch + Logstash + Kibana)是主流的日志分析栈,单机版部署适用于中小规模日志场景 (日均日志量百万级以内),可实现日志的采集、解析、存储、检索、可视化 全流程管理。本方案聚焦单主机部署,简化架构,降低运维成本。

一、方案概述

1. 架构设计

单机版 ELK 采用一体化部署,所有组件运行在同一台服务器,架构如下:

复制代码
业务应用 → 日志文件 → Logstash(采集/解析)→ Elasticsearch(存储/检索)→ Kibana(可视化/查询)
  • Elasticsearch:核心存储与检索引擎,负责日志的结构化存储和快速查询。
  • Logstash:日志采集与处理管道,读取本地日志文件,解析为结构化数据后发送至 Elasticsearch。
  • Kibana:可视化界面,提供日志检索、仪表盘、告警等功能。

2. 部署前提

资源类型 最低配置要求 推荐配置
CPU 2 核 4 核及以上
内存 4GB 8GB 及以上
磁盘 50GB(SSD) 200GB+(SSD,根据日志留存周期调整)
操作系统 Linux(CentOS 7/8、Ubuntu 18.04+) Linux(CentOS 7)
JDK 11(Elasticsearch 7.x+ 内置,无需手动安装) -

3. 版本选择

建议选择 Elastic Stack 7.x 系列(如 7.17.x),该版本稳定且兼容性好,避免使用 8.x 版本(单机部署配置复杂,需要处理安全认证)。

二、部署步骤(以 CentOS 7 为例)

步骤 1:系统环境准备

  1. 关闭防火墙和 SELinux

    bash 复制代码
    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    
    # 关闭 SELinux
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
  2. 设置系统内核参数 Elasticsearch 需要调整内核参数以支持内存锁定和最大文件描述符,编辑 /etc/security/limits.conf

    bash 复制代码
    echo "* soft nofile 65535" >> /etc/security/limits.conf
    echo "* hard nofile 65535" >> /etc/security/limits.conf
    echo "* soft memlock unlimited" >> /etc/security/limits.conf
    echo "* hard memlock unlimited" >> /etc/security/limits.conf

    编辑 /etc/sysctl.conf

    bash 复制代码
    echo "vm.max_map_count=262144" >> /etc/sysctl.conf
    sysctl -p
  3. 重启系统

    bash 复制代码
    reboot

步骤 2:安装 Elasticsearch

  1. 添加 Elastic 官方源

    bash 复制代码
    rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    vi /etc/yum.repos.d/elastic.repo

    写入以下内容:

    复制代码
    [elasticsearch-7.x]
    name=Elasticsearch repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
  2. 安装 Elasticsearch

    bash 复制代码
    yum install elasticsearch-7.17.0 -y
  3. 配置 Elasticsearch 编辑主配置文件 /etc/elasticsearch/elasticsearch.yml,修改以下关键参数:

    XML 复制代码
    # 集群名称(单机集群,名称自定义)
    cluster.name: elk-single-node
    # 节点名称
    node.name: node-1
    # 数据存储路径
    path.data: /var/lib/elasticsearch
    # 日志存储路径
    path.logs: /var/log/elasticsearch
    # 绑定地址(允许外部访问,单机可设为 0.0.0.0)
    network.host: 0.0.0.0
    # HTTP 端口
    http.port: 9200
    # 单机模式,禁用多节点发现
    discovery.type: single-node
    # 启用内存锁定(避免内存交换)
    bootstrap.memory_lock: true

    编辑 JVM 配置文件 /etc/elasticsearch/jvm.options,调整堆内存大小(建议为物理内存的 1/2,不超过 32GB):

    复制代码
    -Xms2g
    -Xmx2g
  4. 启动并设置开机自启

    复制代码
    systemctl daemon-reload
    systemctl start elasticsearch
    systemctl enable elasticsearch
  5. 验证 Elasticsearch 是否启动成功

    复制代码
    curl http://localhost:9200

    若返回如下 JSON 数据,说明启动成功:

    复制代码
    {
      "name" : "node-1",
      "cluster_name" : "elk-single-node",
      "cluster_uuid" : "xxxxxxxxxxxx",
      "version" : {
        "number" : "7.17.0",
        "build_flavor" : "default",
        "build_type" : "rpm",
        "build_hash" : "xxxxxxxxxxxx"
      },
      "tagline" : "You Know, for Search"
    }

步骤 3:安装 Logstash

  1. 安装 Logstash

    复制代码
    yum install logstash-7.17.0 -y
  2. 配置 Logstash 日志采集管道 Logstash 配置分为 3 部分:input(输入)、filter(过滤解析)、output(输出)。新建配置文件 /etc/logstash/conf.d/app-log.conf,示例配置如下(采集 Nginx 或自定义应用日志):

    复制代码
    # 1. 输入:读取本地日志文件
    input {
      file {
        # 日志文件路径(替换为业务应用的日志路径)
        path => ["/var/log/app/*.log"]
        # 从文件末尾开始读取
        start_position => "end"
        # 监听文件变化的间隔时间
        stat_interval => 1
        # 自定义字段,用于区分日志来源
        tags => ["app-logs"]
        # 编码格式
        codec => plain { charset => "UTF-8" }
      }
    }
    
    # 2. 过滤:解析日志为结构化数据(以常见的日志格式为例)
    filter {
      # 匹配日志格式:[2025-01-01 10:00:00] [INFO] [user-123] - 登录成功
      grok {
        match => { "message" => "\[%{DATE:log_date} %{TIME:log_time}\] \[%{LOGLEVEL:log_level}\] \[%{DATA:user_id}\] - %{GREEDYDATA:log_content}" }
      }
      # 合并日期和时间为@timestamp字段(Elasticsearch 时间字段)
      date {
        match => [ "log_date %{log_time}", "yyyy-MM-dd HH:mm:ss" ]
        target => "@timestamp"
      }
      # 删除无用字段
      mutate {
        remove_field => ["message", "log_date", "log_time", "path", "host"]
      }
    }
    
    # 3. 输出:发送到 Elasticsearch
    output {
      elasticsearch {
        # Elasticsearch 地址
        hosts => ["http://localhost:9200"]
        # 索引名称(每天生成一个索引,格式:app-log-2025.01.01)
        index => "app-log-%{+YYYY.MM.dd}"
      }
      # 控制台输出(调试用,生产环境可注释)
      stdout { codec => rubydebug }
    }
    • grok 模式说明 :可根据实际日志格式调整,可使用 Grok Debugger 在线调试。
    • 多日志类型 :若需采集多种日志(如 Nginx、Java 应用),可创建多个 .conf 配置文件。
  3. 启动并设置开机自启

    bash 复制代码
    systemctl start logstash
    systemctl enable logstash

步骤 4:安装 Kibana

  1. 安装 Kibana

    bash 复制代码
    yum install kibana-7.17.0 -y
  2. 配置 Kibana 编辑配置文件 /etc/kibana/kibana.yml

    复制代码
    # 绑定地址(允许外部访问)
    server.host: "0.0.0.0"
    # Kibana 端口
    server.port: 5601
    # Elasticsearch 地址
    elasticsearch.hosts: ["http://localhost:9200"]
    # 中文界面(可选)
    i18n.locale: "zh-CN"
  3. 启动并设置开机自启

    bash 复制代码
    systemctl start kibana
    systemctl enable kibana
  4. 访问 Kibana 界面 浏览器访问 http://服务器IP:5601,首次登录无需账号密码(7.x 单机模式默认关闭安全认证)。

三、日志接入与使用

1. 日志索引配置

  1. 登录 Kibana → 点击左侧 Stack ManagementIndex PatternsCreate index pattern
  2. 输入索引名称匹配规则(如 app-log-*),点击 Next step
  3. 选择时间字段为 @timestamp,点击 Create index pattern

2. 日志检索与分析

  1. 点击左侧 Discover,选择已创建的索引模式。
  2. 可通过以下方式检索日志:
    • 时间范围筛选:顶部选择时间范围(如近 1 小时、近 1 天)。
    • 关键词搜索 :搜索框输入关键词(如 log_level:ERRORuser_id:user-123)。
    • 字段过滤 :左侧字段列表勾选需展示的字段(如 log_levellog_content)。

3. 可视化仪表盘(可选)

  1. 点击左侧 DashboardCreate dashboardAdd visualization
  2. 选择可视化类型(如柱状图、饼图),配置数据源和统计维度(如按 log_level 统计数量)。
  3. 保存仪表盘,实现日志指标的可视化监控。

四、运维与优化

1. 日志索引生命周期管理(ILM)

为避免 Elasticsearch 磁盘耗尽,需配置索引生命周期策略,自动删除过期日志:

  1. Kibana → Stack ManagementIndex Lifecycle PoliciesCreate policy
  2. 配置策略:
    • Hot 阶段:索引写入阶段,保留 7 天。
    • Delete 阶段:7 天后自动删除索引。
  3. 将策略绑定到日志索引(如 app-log-*)。

2. 性能优化

  • Elasticsearch 优化
    1. 确保磁盘为 SSD,提升读写性能。
    2. 调整 JVM 堆内存(不超过物理内存的 1/2,且不超过 32GB)。
    3. 关闭不需要的功能(如集群监控、自动创建索引)。
  • Logstash 优化
    1. 启用 file 输入插件的 sincedb 功能,避免重复采集日志。
    2. 生产环境关闭 stdout 输出,减少资源消耗。

3. 监控告警(可选)

  1. 安装 Metricbeat,采集 ELK 组件的运行指标(CPU、内存、磁盘使用率)。
  2. Kibana → Alerting,配置告警规则(如磁盘使用率超过 80% 时触发告警)。

五、常见问题

  1. Elasticsearch 启动失败 :检查 /var/log/elasticsearch/elk-single-node.log,常见原因是内存锁定失败或内核参数未生效。
  2. Logstash 不采集日志 :检查日志文件路径权限、配置文件语法是否正确,查看 /var/log/logstash/logstash-plain.log
  3. Kibana 无法访问:检查防火墙是否开放 5601 端口,Elasticsearch 是否正常运行。
相关推荐
Volunteer Technology7 小时前
FastDFS+Nginx
运维·nginx
李小白202002027 小时前
EMMC写入/烧录逻辑
linux·运维·服务器
Trouvaille ~8 小时前
【Linux】UDP Socket编程实战(二):网络字典与回调设计
linux·运维·服务器·网络·c++·udp·操作系统
徐子元竟然被占了!!8 小时前
虚拟化技术
运维
为什么不问问神奇的海螺呢丶8 小时前
n9e categraf docker 监控配置
运维·docker·容器
Kiyra8 小时前
从《守望先锋》2026前瞻,看大型分布式系统的“重构”与“并发挑战”
运维·服务器·重构
青树寒鸦8 小时前
wsl的docker备份mongo和迁移
运维·mongodb·docker·容器
niceffking8 小时前
linux系统编程-线程概述
linux·运维
Bdygsl8 小时前
Linux(12)—— 文件与文件描述符
linux·运维·服务器
艾莉丝努力练剑8 小时前
【Linux:文件】基础IO:文件操作的系统调用和库函数各个接口汇总及代码演示
linux·运维·服务器·c++·人工智能·centos·io