基于 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 是否正常运行。
相关推荐
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ17 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔19 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密19 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi201519 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
卷福同学20 小时前
【养虾日记】QClaw操作浏览器自动化发文
运维·人工智能·程序人生·自动化
woho77889920 小时前
不同网段IP的网络打印机,打印、扫描设置
运维·服务器·网络
耗子会飞21 小时前
小白学习固定VM虚拟机的centos服务器的IP
运维·服务器·centos
门豪杰21 小时前
Ubuntu下安装Claude Code
linux·运维·ubuntu·claude·claude code
新新学长搞科研1 天前
第五届电子、集成电路与通信技术国际学术会议(EICCT 2026)
运维·人工智能·自动化·集成测试·信号处理·集成学习·电气自动化
桌面运维家1 天前
Windows/Linux双启动:BIOS/UEFI多配置桌面创建指南
linux·运维·windows