文档章节

目前线上环境(ubuntu server)终于部署好一个logstash日志收集系统了

Feng_Yu
 Feng_Yu
发布于 2015/01/27 10:31
字数 1824
阅读 9820
收藏 60

断断续续的看了一周logstash的文档,总算在线上ubuntu搭建起来一个logstash环境了。现在分享一下自己的经验

ELK扩展到整个日志系统的搭建,可以参考新的Blog: http://my.oschina.net/abcfy2/blog/703158

#关于logstash 这玩意现在还算是火爆,依托于elasticsearch这棵大树下,logstash的关注度是非常高的,项目目前来说算是活跃。logstash是一个用于日志收集、分析的系统,架构设计非常灵活,几乎可以满足各种规模的需求。

#logstash的逻辑架构 logstash的逻辑架构其实一点都不复杂,经历收集->过滤->输出三个步骤即可简简单单的筛选与管理日志,这简简单单的三个步骤经过符合业务规模的设计之后,就可以满足各种规模的需求了。

logstash的配置文件也很简单

<!--lang: conf-->

input { }

filter { }

output { }

经过这三个基本配置段,就可以筛选出符合自己要求的日志了。

#一些参考资料 说实话,logstash的官方文档实在是太过于简略了,我第一次看完之后完全一抹黑,根本不会写,后来是看了官方推荐的《logstash book》这本书之后才慢慢了解清楚logstash到底怎么回事。因此这本书也是强烈推荐的。不过新版本的书目前还没找到免费的,我当时看的是1.3.4版本的,虽然版本低了些,和现在的logstash有些不太一样(不再使用fatjar打包了,而是直接用bash脚本传参给ruby脚本启动),不过主体功能没多大变化,配合官方文档的一些说明还是可以学习的。

其他可以google一些别人写的配置做参考

#我用的业务模型 我的规模其实很小,就收集几个服务器的java程序的日志(log4j输出),推送到中央服务器进行查看而已,必要的时候进行报警。

因此我采用的规模是这样的, 在线上服务器上(input => file, filter => grok, output => tcp),从日志文件中接受输入,使用grok正则过滤器进行提取日志,使用tcp协议直接发送到中央日志服务器上进行收集和展示。

在日志服务器上(input => tcp, output => elasticsearch and email),不增加中央服务器太高的负载,将正则过滤部分放在产品服务器上,中央服务器只是收集过滤过的日志之后做一下索引展示而已,整套架构没有用到redis,因为我的规模量比较少,日志也很少,没必要用redis存储日志,只索引日志用于查询就够了。

#我的配置 理清了使用的架构之后,那么写配置就非常容易了。

在产品服务器上配置如下:

input {
    file {
        type => "my_app"
        path => "/var/log/tomcat7/my_app.log"
        tags => [ "my_app", "log4j" ]
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601}"
            negate => true
            what => "previous"
        }
    }
}

filter {
    if [type] == "my_app" {
        grok {
            match => { "message" => 
                "%{TIMESTAMP_ISO8601:date} \[(?<thread_name>.+?)\] (?<log_level>\w+)\s*(?<content>.*)"
            }
        }

        if [log_level] == "ERROR" and "Invalid password for user" not in [content] {
            throttle {
                after_count => 2
                key => "%{content}"
                add_tag => "throttled"
            }
        }
    }
}

output {
    tcp {
        codec => json_lines
        host => "center.com"
        mode => "client"
        port => "tcp_port"
    }
}

过滤这样的日志:

          date                 thread_name            log_level                      content
           |                         |                   |                              |
2015-01-27 10:37:32,131 [ajp-apr-127.0.0.1-8009-exec-2] INFO  mobile.ShortMessageService  - {success=true}
2015-01-27 10:41:18,447 [ajp-apr-127.0.0.1-8009-exec-1] ERROR security.UserService  - grails.validation.ValidationException: Validation Error(s) occurred during save():

增加了throttle这个plugin,目的是为了当有大量异常出现的时候,过滤掉重复的异常,不至于发爆邮箱。

在日志服务器配置如下

input {
    tcp {
        codec => json_lines
        host => "0.0.0.0"
        mode => "server"
        port => "tcp_port"
    }
}

filter {
    if ! [tags] or ! [type] {
        drop { }
    }
}

output {
    elasticsearch_http {
        host => "localhost"
    }

    if "throttled" not in [tags] and [type] == "my_app" and [log_level] == "ERROR" and "Invalid password for user" not in [content] ) { 
        email {
            body => "%{message}"
            from => "smtp@email.com"
            contenttype => "text/plain; charset=UTF-8"
            options => [
                "smtpIporHost", "smtp.email.com",
                "userName", "login_name",
                "password", "password",
                "authenticationType", "login"
            ]
            subject => "服务器%{host} %{type}日志发现异常: %{content}"
            to => "alter_email@email.com"
        }
    }
}

给日志服务器最终也加上了filter,因为tcp端口对外暴露,暴露在互联网的端口你懂得,各种扫描,会引来大量的垃圾信息,因此必须要先过滤掉这些垃圾信息,才是有用的日志记录。

推送到elasticsearch,就在本机装着。elasticsearch是很好的索引服务,索引日志之后用于快速筛选和查找。

这样,一个初步可用的logstash就搭建好了,也能适应我目前的规模了。展示到页面上用的是kibana这个项目,也是elasticsearch旗下的项目,使用和配置都很简单,就不再细说了。

#批量部署

配置都测试完毕,就剩下批量部署了,使用的saltstack,给logstash添加一个state,也很简单: cat /srv/salt/logstash.sls

<!--lang: yaml-->

#logstash_repo:
#  pkgrepo.managed:
#    - name: deb http://packages.elasticsearch.org/logstash/1.4/debian stable main
#    - file: /etc/apt/sources.list.d/logstash.list
#    - key_url: http://packages.elasticsearch.org/GPG-KEY-elasticsearch
#
#logstash:
#  pkg.latest:
#    - refresh: True

logstash:
  pkg.installed:
    - sources:
      - logstash: http://myserver/downloads/logstash_1.4.2-1-2c0f5a1_all.deb

logstash-config:
  file.recurse:
    - name: /etc/logstash/conf.d
    - source: salt://servers/logstash/conf.d/
    - makedirs: True

logstash-service:
  service.running:
    - name: logstash
    - enable: True
    - watch:
      - pkg: logstash
      - file: logstash-config

注释部分是logstash的官方源,参考这里,不过我这边使用实在是太慢了,不利于批量部署。不得已,只好自己下载deb包放在自己的服务器上,使用pkg.install中的sources指令从自己的服务器下载deb包安装了。

最后,使用salt '*' state.sls logstash搞定,批量部署完毕,日志都上来了。

#总结一些坑 ##首先是版本问题 我发现国内的资料大多都老旧(如果用百度去看别人的配置,可能还在1.3以下版本),很多配置段都废弃了,因此写配置之前务必先看官方文档中plugin的文档。比如除了input plugin的type field之外,几乎所有的plugin的type field都废弃了。

其次是启动方式也略有不同,低版本的logstash使用的是fatjar方式,使用java -jar方式启动,需要自己解决依赖。但是从1.4版本以后,这种方式已经不再需要,只需要一个jdk环境即可,别的依赖已经打包到压缩包中了。个人十分推荐使用软件包的方式,自带服务服务管理脚本,好维护,好配置。

##tcp配置的坑 打通这个tcp配置着实费了不少工夫,一开始怎么都不通,按文档配置也没发现什么问题(mode默认client,在服务器手工改为server),但是数据就是上不来,检查日志发现有警告

:message=>"JSON parse failure. Falling back to plain-text", xxxxxxxxxxxxx

于是google,发现解决方案 (google group链接,需爬墙),在input tcp这里加上codec => json_lines,fix.

##kibana 正式稳定版本目前为3.1.2,使用这个版本部署会发现无法访问elasticsearch,最新的beta版无此问题,但是部署比较麻烦点。参考这个issue解决。

##elasticsearch http默认不启用gzip 当查询到的数据比较多的时候,明显感觉到慢,打开chrome的network的时候发现elasticsearch返回的数据非常大,占满带宽。于是继续google,加入一以下配置启用gzip,解决。

http.compression: true

© 著作权归作者所有

共有 人打赏支持
Feng_Yu
粉丝 157
博文 38
码字总数 45571
作品 0
西安
运维
私信 提问
加载中

评论(8)

雪域boby
雪域boby
能加我QQ么,楼主。710899905
zhf_sy
zhf_sy
mark
harrik
harrik
mark
steel
steel
mark
south
south
mark
f
firefly303
mark
r
renyi1986
mark
韦不良
韦不良
mark
Kibana+Logstash+Elasticsearch+Redis安装部署

最近做日志分析,发现logstash较符合自己的需求, Logstash:做系统log收集,转载的工具。同时集成各类日志插件,对日志查询和分析的效率有很大的帮助.一般使用shipper作为log收集、indexer作...

帅哥点烟用雷电
2014/05/14
0
0
小白都会超详细--ELK日志管理平台搭建教程

目录 一、介绍 二、安装JDK 三、安装Elasticsearch 四、安装Logstash 五、安装Kibana 六、Kibana简单使用 系统环境:CentOS Linux release 7.4.1708 (Core) 当前问题状况 开发人员不能登录线...

渣渣辉
07/15
0
0
ELKStack篇(1)——ElasticSearch篇

1.没有日志分析系统 1.1运维痛点 1.运维要不停的查看各种日志。 2.故障已经发生了才看日志(时间问题。) 3.节点多,日志分散,收集日志成了问题。 4.运行日志,错误等日志等,没有规范目录,收...

1160636144
2016/12/23
0
0
从 ELK 到 EFK 演进

背景 作为中国最大的在线教育站点,目前沪江日志服务的用户包含网校,交易,金融,CCTalk 等多个部门的多个产品的日志搜索分析业务,每日产生的各类日志有好十几种,每天处理约10亿条(1TB)...

顶风走千里
2017/12/19
0
0
从ELK到EFK演进

背景 作为中国最大的在线教育站点,目前沪江日志服务的用户包含网校,交易,金融,CCTalk 等多个部门的多个产品的日志搜索分析业务,每日产生的各类日志有好十几种,每天处理约10亿条(1TB)...

6776jkjk
2017/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
3
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
2
0
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public v......

go4it
昨天
6
0
CentOS 生产环境配置

初始配置 对于一般配置来说,不需要安装 epel-release 仓库,本文主要在于希望跟随 RHEL 的配置流程,紧跟红帽公司对于服务器的配置说明。 # yum update 安装 centos-release-scl # yum ins...

clin003
昨天
9
0
GPON网络故障处理手册

导读 为了方便广大网络工作者工作需要,特搜集以下GPON网络处理流程供大家学习参考。开始—初步定为故障—检查光纤状况—检查ONU状态--检查设备运行状态—检查设备数据配置—检查上层设备状态...

问题终结者
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部