技術棧線:前端
1. 支持靈活的處理方式,Elasticsearch是實時全文索引,無需像其它的產品樣預先編程才能實現java
2. 支持簡單的配置方式,Elasticsearch是所有采用JSON接口,Logstash是Ruby DSL設計,都是通用配置語法node
3. 支持高效的數據檢索,雖然每次查詢都是實時計算,但基本上能夠實現全天數據查詢的秒級響應python
4. 支持方便的線性擴展,無論是Elasticsearch集羣仍是Logstash集羣均可以線性擴展編程
4. 支持絢麗的前端展現,Kibana界面上只須要點擊鼠標,就能夠完成搜索,聚合,生產絢麗的儀表盤數組
常規架構:ruby
簡單介紹:bash
說明: Logstash做爲一款接收,處理,輸出日誌的工具,能夠處理各類各樣的日誌,由JRuby編寫,支持大量的配套插件,於2013年被Elasticsearch收購,正式成爲Elastic Stack的一員.架構
現包安裝:app
rpm -qa |grep jdk |xargs rpm -e --nodeps yum -y install gcc cmake coreutils lsof pcre pcre-devel zlib zlib-devel coreutils lrzsz wget python-setuptools epel-release yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel nc jq rpm -ivh https://artifacts.elastic.co/downloads/logstash/logstash-5.0.0.rpm
源碼部署:
# 安裝 JAVA 運行 環境 rpm -qa |grep jdk |xargs rpm -e --nodeps yum -y install gcc cmake coreutils lsof pcre pcre-devel zlib zlib-devel coreutils lrzsz wget python-setuptools epel-release yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel nc jq java -version # 建立 LOGSTASH目錄 mkdir -p /xm-workspace/xm-apps/logstash/ tar -zxvf logstash-5.0.0.tar.gz mv logstash-5.0.0/* /xm-workspace/xm-apps/logstash/ # 建立 配置 文件 目錄 mkdir -p /xm-workspace/xm-apps/logstash/etc/logstash.d
經常使用參數:
-n | 指定Logstash實例的名稱,若是未指定,默認爲主機名 |
-f | 指定Logstash配置文件或目錄,若是指定目錄則合併目錄中配置文件 |
-e | 指定Logstash配置數據,以字符串的形式指定,經常使用於手工測試 |
-l | 指定Logstash日誌文件目錄,默認安裝目錄下logs目錄 |
--debug | 開啓Logstash調試模式 |
--log.level | 指定Logstash日誌級別,fatal/error/warn/info/debug/trace |
--config.debug | 指定Logstash打印配置合併日誌,開啓前提是打開調試模式--debug以及設置日誌級別 |
-t | 測試Logstash配置文件,,必須配合-f使用 |
-r | 設置Logstash自動重載配置文件,必須配合-f使用 |
--config.reload.interval | 設置Logstash重載配置週期,默認爲3秒 |
--http.host | 設置LogstashAPI監聽地址 |
--http.port | 設置LogstashAPI監聽端口 |
--quiet | 設置 Logstash爲安靜模式 |
注意: 當-f指定目錄時,Logstash會自動讀取目錄下全部*.conf配置文件,按照字母排序,而後在內存中拼接成一個完整的大配置文件加載,推薦採用數字編號方式命名配置文件,且同時在配置中嚴謹使用if判斷限定不一樣日誌的動做,還有就是從5.0開始全部的命令行配置均可經過/xm-workspace/xm-apps/logstash/config/logstash.yml文件設置.
快速測試:
/xm-workspace/xm-apps/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}' --debug
{ "@timestamp" => 2016-12-06T08:37:52.922Z, "@version" => "1", "host" => "YunChanPinXian", "message" => "limanman" }
說明: 數據以事件對象的形式在線程之間傳遞,Logstash會自動爲事件對象添加一些額外信息,最重要的就是@timestamp,用來標記事件的發生時間,此字段以joda時間對象的形式內部流轉,並且還支持在過濾插件中經過add_tag/remove_tag/add_field/remove_field對事件對象添加刪除標籤數組和自定義字段.
配置語法:
1. Logstash設計了本身的DSL(相似Puppet的DSL)來描述配置,使用{}定義區域,區域內能夠包含多個插件區域,插件域內能夠定義對應區域的鍵值對設置
2. Logstash支持少許的數據類型如bool類型(debug => true),string類型(host => "hostname"),number類型(port => 514),array類型(match => ["datetime", "UNIX", "ISO8601"]),hash類型(options => {key1 => "value1",key2 => "value2"})
3. Logstash支持字段引用,因爲字段能夠是hash或array類型,因此可經過[field]來還原字段對象,並且還支持正倒序下標檢索子元素,若是要在字符串中使用字段引用可經過%{[field][...]}實現
4. Logstash支持==等於/!=不等於/<小於/>大於/<=小於等於/>=大於等於/=~匹配/!~不匹配/in包含/not in不包含/and與/or或/nand非與/xor非或/()複合表達式/!()取反覆合表達式
if "_grokparsefailure" not in [tags] { } else if [status] !~ /^2\d\d/ or ( [url] == "/noc.gif" nand [geoip][city] != "beijing" ) { } else { }
後臺運行:
#!/bin/sh # -*- coding: utf-8 -*- # # # Authors: limanman # OsChina: http://xmdevops.blog.51cto.com/ # Purpose: control logstash start|stop|force-stop|status|restart # # # customer env name=logstash pidfile="/var/run/${name}.pid" LS_HOME=/xm-workspace/xm-apps/logstash export PATH=/sbin:/usr/sbin:/bin:/usr/bin:${LS_HOME}/bin # must use root if [ `id -u` -ne 0 ]; then echo "You need root privileges to run this script" exit 1 fi # optimizations LS_HEAP_SIZE="1024m" LS_OPEN_FILES=102400 # logstash comm # LS_OPTS="--debug" LS_OPTS="--quiet" LS_LOG_DIR=${LS_HOME}/logs LS_CONF_DIR="${LS_HOME}/etc/logstash.d" [ ! -d ${LS_HOME} ] && mkdir -p ${LS_HOME} [ ! -d ${LS_LOG_DIR} ] && mkdir -p ${LS_LOG_DIR} [ ! -d ${LS_CONF_DIR} ] && mkdir -p ${LS_CONF_DIR} program=${LS_HOME}/bin/${name} args="-f ${LS_CONF_DIR} -l ${LS_LOG_DIR} ${LS_OPTS}" start() { LS_JAVA_OPTS="${LS_JAVA_OPTS} -Djava.io.tmpdir=${LS_HOME}" HOME=${LS_HOME} export PATH HOME LS_HEAP_SIZE LS_JAVA_OPTS LS_USE_GC_LOGGING ulimit -n ${LS_OPEN_FILES} # Run the program! bash -c " cd $LS_HOME ulimit -n ${LS_OPEN_FILES} exec \"$program\" $args " 2> "${LS_LOG_DIR}/${name}-error.log" &>/dev/null & echo $! > $pidfile echo "${name} started." return 0 } stop() { if status ; then pid=`cat "$pidfile"` echo "Killing ${name} (pid $pid) with SIGTERM" kill -TERM $pid for i in 1 2 3 4 5 ; do echo "Waiting ${name} (pid $pid) to die..." status || break sleep 1 done if status ; then echo "${name} stop failed; still running." else echo "${name} stopped." fi fi } status() { if [ -f "$pidfile" ] ; then pid=`cat "$pidfile"` if kill -0 $pid > /dev/null 2> /dev/null ; then return 0 else return 2 fi else return 3 fi } force_stop() { if status ; then stop status && kill -KILL `cat "$pidfile"` fi } case "$1" in start) status code=$? if [ $code -eq 0 ]; then echo "${name} is already running" else start code=$? fi exit $code ;; stop) stop ;; force-stop) force_stop ;; status) status code=$? if [ $code -eq 0 ] ; then echo "${name} is running" else echo "${name} is not running" fi exit $code ;; restart) stop && start ;; *) echo "Usage: ${SCRIPTNAME} {start|stop|force-stop|status|restart}" >&2 exit 3 ;; esac exit $?
注意: 爲了使Logstash後臺運行,無論是nohub ... &仍是screen仍是supervisord管理進程時千萬不要把配置目錄中的配置文件中的input {}區段設置爲測試用的stdin {},不然進程運行一下子就會自動退出.