OpenStack日志搜集分析之ELK

ELK 安装配置简单,用于管理 OpenStack 日志时需注意两点:

  • Logstash 配置文件的编写
  • Elasticsearch 日志存储空间的容量规划

另外推荐 ELKstack 中文指南


ELK 简介

ELK 是一套优秀的日志搜集、存储和查询的开源软件,广泛用于日志系统。当 OpenStack 集群达到一定规模时,日志管理和分析显得日益重要,良好统一的日志管理和分析平台有助于快速定位问题。Mirantis 的 fuel 和 HPE 的 helion 均集成了 ELK。

采用 ELK 管理 OpenStack 的日志具有以下优点:

  • 迅速查询全局 ERROR 级别日志
  • 某个 API 的请求频率
  • 通过 request ID, 可过滤出某个 API 整个流程的日志

规划与设计

部署架构

控制节点作为日志服务器,存储所有 OpenStack 及其相关日志。Logstash 部署于所有节点,收集本节点下所需收集的日志,然后以网络(node/http)方式输送给控制节点的 Elasticsearch,Kibana 作为 web portal 提供展示日志信息:

日志格式

为了提供快速直观的检索功能,对于每一条 OpenStack 日志,我们希望它能包含以下属性,用于检索和过滤:

  • Host: 如 controller01,compute01 等
  • Service Name: 如 nova-api, neutron-server 等
  • Module: 如 nova.filters
  • Log Level: 如 DEBUG, INFO, ERROR 等
  • Log date
  • Request ID: 某次请求的 Request ID

以上属性可以通过 Logstash 实现,通过提取日志的关键字段,从而获上述几种属性,并在 Elasticsearch 建立索引。


安装与配置

安装

ELK 的安装步骤非常简单,可参考 logstash-es-Kibana 安装,如遇异常,请 Google。

配置

Logstash 的配置文件有专门的一套语法,学习的成本比较高,可参考 openstack logstash config 后,再根据自身需求改写:

input {
  file {
    path => [‘/var/log/nova/nova-api.log‘]
    tags => [‘nova‘, ‘oslofmt‘]
    type => "nova-api"
  }
  file {
    path => [‘/var/log/nova/nova-conductor.log‘]
    tags => [‘nova-conductor‘, ‘oslofmt‘]
    type => "nova"
  }
  file {
    path => [‘/var/log/nova/nova-manage.log‘]
    tags => [‘nova-manage‘, ‘oslofmt‘]
    type => "nova"
  }
  file {
    path => [‘/var/log/nova/nova-scheduler.log‘]
    tags => [‘nova-scheduler‘, ‘oslofmt‘]
    type => "nova"
  }
  file {
    path => [‘/var/log/nova/nova-spicehtml5proxy.log‘]
    tags => [‘nova-spice‘, ‘oslofmt‘]
    type => "nova"
  }
  file {
    path => [‘/var/log/keystone/keystone-all.log‘]
    tags => [‘keystone‘, ‘keystonefmt‘]
    type => "keystone"
  }
  file {
    path => [‘/var/log/keystone/keystone-manage.log‘]
    tags => [‘keystone‘, ‘keystonefmt‘]
    type => "keystone"
  }
  file {
    path => [‘/var/log/glance/api.log‘]
    tags => [‘glance‘, ‘oslofmt‘]
    type => "glance-api"
  }
  file {
    path => [‘/var/log/glance/registry.log‘]
    tags => [‘glance‘, ‘oslofmt‘]
    type => "glance-registry"
  }
  file {
    path => [‘/var/log/glance/scrubber.log‘]
    tags => [‘glance‘, ‘oslofmt‘]
    type => "glance-scrubber"
  }
  file {
    path => [‘/var/log/ceilometer/ceilometer-agent-central.log‘]
    tags => [‘ceilometer‘, ‘oslofmt‘]
    type => "ceilometer-agent-central"
  }
  file {
    path => [‘/var/log/ceilometer/ceilometer-alarm-notifier.log‘]
    tags => [‘ceilometer‘, ‘oslofmt‘]
    type => "ceilometer-alarm-notifier"
  }
  file {
    path => [‘/var/log/ceilometer/ceilometer-api.log‘]
    tags => [‘ceilometer‘, ‘oslofmt‘]
    type => "ceilometer-api"
  }
  file {
    path => [‘/var/log/ceilometer/ceilometer-alarm-evaluator.log‘]
    tags => [‘ceilometer‘, ‘oslofmt‘]
    type => "ceilometer-alarm-evaluator"
  }
  file {
    path => [‘/var/log/ceilometer/ceilometer-collector.log‘]
    tags => [‘ceilometer‘, ‘oslofmt‘]
    type => "ceilometer-collector"
  }
  file {
    path => [‘/var/log/heat/heat.log‘]
    tags => [‘heat‘, ‘oslofmt‘]
    type => "heat"
  }
  file {
    path => [‘/var/log/neutron/neutron-server.log‘]
    tags => [‘neutron‘, ‘oslofmt‘]
    type => "neutron-server"
  }
# Not collecting RabbitMQ logs for the moment
#  file {
#   path => [‘/var/log/rabbitmq/[email protected]<%= @hostname %>.log‘]
#   tags => [‘rabbitmq‘, ‘oslofmt‘]
#   type => "rabbitmq"
#  }
  file {
    path => [‘/var/log/httpd/access_log‘]
    tags => [‘horizon‘]
    type => "horizon"
  }
  file {
    path => [‘/var/log/httpd/error_log‘]
    tags => [‘horizon‘]
    type => "horizon"
  }
  file {
    path => [‘/var/log/httpd/horizon_access_log‘]
    tags => [‘horizon‘]
    type => "horizon"
  }
  file {
    path => [‘/var/log/httpd/horizon_error_log‘]
    tags => [‘horizon‘]
    type => "horizon"
  }
}
filter {
  if "oslofmt" in [tags] {
    multiline {
      negate => true
      pattern => "^%{TIMESTAMP_ISO8601} "
      what => "previous"
    }
    multiline {
      negate => false
      pattern => "^%{TIMESTAMP_ISO8601}%{SPACE}%{NUMBER}?%{SPACE}?TRACE"
      what => "previous"
    }
    grok {
      # Do multiline matching as the above mutliline filter may add newlines
      # to the log messages.
      # TODO move the LOGLEVELs into a proper grok pattern.
      match => { "message" => "(?m)^%{TIMESTAMP_ISO8601:logdate}%{SPACE}%{NUMBER:pid}?%{SPACE}?(?<loglevel>AUDIT|CRITICAL|DEBUG|INFO|TRACE|WARNING|ERROR) \[?\b%{NOTSPACE:module}\b\]?%{SPACE}?%{GREEDYDATA:logmessage}?" }
      add_field => { "received_at" => "%{@timestamp}" }
    }
  } else if "keystonefmt" in [tags] {
    grok {
      # Do multiline matching as the above mutliline filter may add newlines
      # to the log messages.
      # TODO move the LOGLEVELs into a proper grok pattern.
      match => { "message" => "(?m)^%{TIMESTAMP_ISO8601:logdate}%{SPACE}%{NUMBER:pid}?%{SPACE}?(?<loglevel>AUDIT|CRITICAL|DEBUG|INFO|TRACE|WARNING|ERROR) \[?\b%{NOTSPACE:module}\b\]?%{SPACE}?%{GREEDYDATA:logmessage}?" }
      add_field => { "received_at" => "%{@timestamp}" }
    }
    if [module] == "iso8601.iso8601" {
  #log message for each part of the date?  Really?
  drop {}
    }
  } else if "libvirt" in [tags] {
    grok {
       match => { "message" => "(?m)^%{TIMESTAMP_ISO8601:logdate}:%{SPACE}%{NUMBER:code}:?%{SPACE}\[?\b%{NOTSPACE:loglevel}\b\]?%{SPACE}?:?%{SPACE}\[?\b%{NOTSPACE:module}\b\]?%{SPACE}?%{GREEDYDATA:logmessage}?" }
       add_field => { "received_at" => "%{@timestamp}"}
    }
    mutate {
       uppercase => [ "loglevel" ]
    }
  } else if [type] == "syslog" {
     grok {
        match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:logmessage}" }
        add_field => [ "received_at", "%{@timestamp}" ]
     }
     syslog_pri {
        severity_labels => ["ERROR", "ERROR", "ERROR", "ERROR", "WARNING", "INFO", "INFO", "DEBUG" ]
     }
     date {
        match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
     }
     if !("_grokparsefailure" in [tags]) {
        mutate {
           replace => [ "@source_host", "%{syslog_hostname}" ]
        }
     }
     mutate {
        remove_field => [ "syslog_hostname", "syslog_timestamp" ]
        add_field => [ "loglevel", "%{syslog_severity}" ]
        add_field => [ "module", "%{syslog_program}" ]
     }
  }
}

output {
    elasticsearch { host => controller }
}

  

时间: 2024-08-14 05:23:01

OpenStack日志搜集分析之ELK的相关文章

结合Docker快速搭建ELK日志收集分析平台

结合Docker快速搭建ELK日志收集分析平台 2017-03-27 09:39 阅读 172 评论 0 作者:马哥Linux运维-Eason ELK Stack ELK (Elasticsearch + Logstash + Kibana),是一个开源的日志收集平台,用于收集各种客户端日志文件在同一个平台上面做数据分析. Introduction Elasticsearch, 基于json分析搜索引擎Logstash, 动态数据收集管道Kibana, 可视化视图将elasticsearh所收集

日志分析工具ELK(五)

八.Kibana实践 选择绝对时间和相对时间 搜索 还可以添加相关信息 自动刷新页面时间,也可以关闭 创建图像,可视化 编辑Markdown,创建一个值班联系表 值班联系表 保存 再创建一个饼图;查看下状态码 保存 再来一个柱状图 保存为访问IP TOP5 添加展示 再添加一个折线图 保存为HTTP响应时间,Dashboard添加,然后保存 再添加一个统计,统计数量 选择system-syslog 保存为日志数据统计 Dashboard添加,然后保存 生产最好加一个Nginx用户认证,不能谁都能

开源日志分析系统ELK平台搭建部署

开源日志分析系统ELK平台搭建部署 一.前言 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误. 通常,日志被分散的储存不同的设备上.如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志.这样是不是感觉很繁琐和效率低下.当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总. 集中化管理

ELK:日志收集分析平台

目录 简介 环境说明 Filebeat 部署 web上采集配置文件 app上采集配置文件 Redis 部署 配置文件 Logstash 部署 Elasticsearch 集群部署 配置文件 Kibana 部署 参考文档 简介 ELK是一个日志收集分析的平台,它能收集海量的日志,并将其根据字段切割.一来方便供开发查看日志,定位问题:二来可以根据日志进行统计分析,通过其强大的呈现能力,挖掘数据的潜在价值,分析重要指标的趋势和分布等,能够规避灾难和指导决策等.ELK是Elasticsearch公司出品

2018年ElasticSearch6.2.2教程ELK搭建日志采集分析系统(目录)

章节一  2018年 ELK课程计划和效果演示 1.课程安排和效果演示 简介:课程介绍和主要知识点说明,ES搜索接口演示,部署的ELK项目演示 章节二 elasticSearch 6.2版本基础讲解到阿里云部署实战 2.搜索引擎知识介绍和相关框架 简介:介绍搜索的基本概念,市面上主流的搜索框架elasticSearch和solr等对比 什么是搜索:在海量信息中获取我们想要的信息 3.新版本 elasticSearch 6.1.2介绍 简介:介绍ES的主要特点和使用场景,新特性讲解 4.windo

2018年ElasticSearch6.2.2教程ELK搭建日志采集分析系统(教程详情)

章节一 2018年 ELK课程计划和效果演示1.课程安排和效果演示简介:课程介绍和主要知识点说明,ES搜索接口演示,部署的ELK项目演示es: localhost:9200kibana http://localhost:5601/ 章节二 elasticSearch 6.2版本基础讲解到阿里云部署实战 2.搜索引擎知识介绍和相关框架简介:介绍搜索的基本概念,市面上主流的搜索框架elasticSearch和solr等对比什么是搜索:在海量信息中获取我们想要的信息传统做法:1.文档中使用系统的Fin

集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack

大数据之心 关注 0.6 2017.02.22 15:36* 字数 2158 阅读 16457评论 7喜欢 9 简介 X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, Watcher, Marvel, Graph, 和 reporting,先来说说这几个爸爸是做什么的吧: Shield: 提供对数据的 Password-Protect,以及加密通信.基于角色的权限控制,IP 过滤,审计,可以有效地: 防止未授权的访问:基于 Password-Protect,基于角

在linux中快速使用docker搭建ELK日志监控分析系统

在linux中使用docker安装ELK日志监控分析系统 网上的教程非常零散或者很多都已经过时了,我这里总结了相比于其他更新的日志系统搭建.并且使用docker镜像,更加简化了安装.在这开始之前先附上我的成功配置截图: linux的安装 linux的安装很简单,但是要使用docker必须安装centos7及以上,不然出现的各种兼容性问题自行百度解决.这里有两种方法: 如果是学生可以购买阿里或者腾讯的linux服务器,简单方便,每个月只要10元钱,其实挺划算的.这是阿里linux的购买地址:htt

使用Docker搭建ELK日志搜集系统(二)

导读:上篇介绍了ELF/EFK中Elasticsearch.Kibana的配置安装,这篇开始介绍Fluentd做为日志搜集工具的配置安装 Fluentd是什么? Fluented 是一个开源免费的日志搜集工具,经常代替Logstash(EFK),支持的插件非常多,对docker支持较好 Fluentd尽量将数据结构化为JSON:这允许Fluentd统一处理日志数据的所有方面:收集.过滤.缓冲和跨多个源和目的地输出日志(统一日志层) 使用JSON进行下游数据处理要容易得多,因为它有足够的结构,可以