ELK日志分析 學習筆記


(貼一篇之前工作期間整理的elk學習筆記)

ELK官網 https://www.elastic.co

 

ELK日志分析系統 學習筆記

概念:ELK = elasticsearch + logstash + kibana

編程語言分別是 Java、JRuby、Ruby
概括的說,logstash 采集和結構化日志,輸入elasticsearch創建索引,kibana查詢elasticsearch這個搜索引擎 來完成數據的分析展示。
ELK 介紹:https://yq.aliyun.com/articles/73622
 
 

elasticsearch 基本概念,原理

詳見:http://www.cnblogs.com/valor-xh/p/6095894.html

基本概念

索引(Index)

ES將數據存儲於一個或多個索引中,索引是具有類似特性的文檔的集合。類比傳統的關系型數據庫領域來說,索引相當於SQL中的一個數據庫,或者一個數據存儲方案(schema)。

舉例說:pandora的所有日志可以存放於一個索引之中。

索引由其名稱(必須為全小寫字符)進行標識,並通過引用此名稱完成文檔的創建、搜索、更新及刪除操作。一個ES集群中可以按需創建任意數目的索引。

類型(Type)

類型是索引內部的邏輯分區(category/partition),然而其意義完全取決於用戶需求。因此,一個索引內部可定義一個或多個類型(type)。一般來說,類型就是為那些擁有相同的域的文檔做的預定義。

舉例說:pandora這個索引的type可以只有一個:pandoralog, 也可根據pandora的模塊 分成多個type, 比如 登陸、部署、配置...

例如,在索引中,可以定義一個用於存儲用戶數據的類型,一個存儲日志數據的類型,以及一個存儲評論數據的類型。類比傳統的關系型數據庫領域來說,類型相當於“表”。

文檔(Document)

文檔是Lucene索引和搜索的原子單位,基於JSON格式進行表示。 一個文檔就是一個保存在 es 中的 JSON 文本,可以把它理解為關系型數據庫表中的一行。每個文檔都是保存在索引中的,擁有一種type和 id。

id

Id 是用於標識文檔的,一個文檔的索引/類型/id 必須是唯一的。文檔 id 是自動生成的(如果不指定)。

field 字段

一個文檔包含了若干字段,或稱之為鍵值對。字段的值可以是簡單(標量)值(例如字符串、整型、日期),也可以是嵌套結構,例如數組或對象。一個字段類似於關系型數據庫表中的一列。每個字段的映射都有一個字段類型(不要和文檔類型搞混了),它描述了這個字段可以保存的值類型,例如整型、字符串、對象。映射還可以讓我們定義一個字段的值如何進行分析。

映射(Mapping)

ES中,所有的文檔在存儲之前都要首先進行分析。用戶可根據需要定義如何將文本分割成token、哪些token應該被過濾掉,以及哪些文本需要進行額外處理等等。

另外,ES還提供了額外功能,例如將域中的內容按需排序。事實上,ES也能自動根據其值確定域的類型。

總結來說, mapping的作用就是執行一系列的指令將輸入的數據轉成可搜索的索引項。

詳見http://blog.csdn.net/lvhong84/article/details/23936697

接下去再說說ES Cluster相關的一些概念。

集群(Cluster)

ES集群是一個或多個節點的集合,它們共同存儲了整個數據集,並提供了聯合索引以及可跨所有節點的搜索能力。

多節點組成的集群擁有冗余能力,它可以在一個或幾個節點出現故障時保證服務的整體可用性。

集群靠其獨有的名稱進行標識,默認名稱為“elasticsearch”。節點靠其集群名稱來決定加入哪個ES集群,一個節點只能屬一個集群。

如果不考慮冗余能力等特性,僅有一個節點的ES集群一樣可以實現所有的存儲及搜索功能。

節點(Node)

運行了單個實例的ES主機稱為節點,它是集群的一個成員,可以存儲數據、參與集群索引及搜索操作。

類似於集群,節點靠其名稱進行標識,默認為啟動時自動生成的隨機Marvel字符名稱。

用戶可以按需要自定義任何希望使用的名稱,但出於管理的目的,此名稱應該盡可能有較好的識別性。

節點通過為其配置的ES集群名稱確定其所要加入的集群。

分片(Shard)和副本(Replica)

ES的“分片(shard)”機制可將一個索引內部的數據分布地存儲於多個節點,它通過將一個索引切分為多個底層物理的Lucene索引完成索引數據的分割存儲功能,這每一個物理的Lucene索引稱為一個分片(shard)。

每個分片其內部都是一個全功能且獨立的索引,因此可由集群中的任何主機存儲。創建索引時,用戶可指定其分片的數量,默認數量為5個。

Shard有兩種類型:primary和replica,即主shard及副本shard。

Primary shard用於文檔存儲,每個新的索引會自動創建5個Primary shard,當然此數量可在索引創建之前通過配置自行定義,不過,一旦創建完成,其Primary shard的數量將不可更改。

Replica shard是Primary Shard的副本,用於冗余數據及提高搜索性能。

每個Primary shard默認配置了一個Replica shard,但也可以配置多個,且其數量可動態更改。ES會根據需要自動增加或減少這些Replica shard的數量。

ES集群可由多個節點組成,各Shard分布式地存儲於這些節點上。

ES可自動在節點間按需要移動shard,例如增加節點或節點故障時。簡而言之,分片實現了集群的分布式存儲,而副本實現了其分布式處理及冗余功能。

 

簡單的一個演示 加深對 index、doucument、type、id 的理解:

10.6.129.101:9200已搭建  通過restApi 與es交互

幾個很常用的接口:

/_cat 查看可用命令 

/_cat/nodes?v:查集群狀態
 
/_cat/health?v :查詢集群健康狀態
 
/_cat/shards?v:查看分片狀態
 
/${index}/${type}/_search?pretty:搜索
/${index}/_search?pretty&q=xxx=xxx :帶條件搜索
/_search?pretty :查詢全部文檔 /_count?pretty

(uri后面加?v 表示 對查詢結果按類型分列展示;?pretty 表示對結果格式化輸出)

 

查看es 可用索引http://10.6.129.101:9200/_cat/indices?v

 

索引雇員文檔

  • 每個雇員索引一個文檔,包含該雇員的所有信息。
  • 每個文檔都將是 employee 類型 。 type
  • 該類型位於 索引 megacorp 內。 index
  • 該索引保存在我們的 Elasticsearch 集群中。

實踐中這非常簡單(盡管看起來有很多步驟),我們可以通過一條命令完成所有這些動作:

(拷貝下列代碼 到kibana DevTools模塊 中運行 是一個很方便的方法)

PUT /megacorp/employee/1

{

    "first_name" : "John",

    "last_name" :  "Smith",

    "age" :        25,

    "about" :      "I love to go rock climbing",

    "interests": [ "sports", "music" ]

}

 

注意,路徑 /megacorp/employee/1 包含了三部分的信息:

megacorp

索引名稱

employee

類型名稱

1

特定雇員的ID

 

接着 再寫入兩條

 

PUT /megacorp/employee/2
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}
 
PUT /megacorp/employee/3
{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}

 

查詢es所有索引http://10.6.129.101:9200/_cat/indices?v  可以看到 新創建的megacorp 索引

檢索文檔

目前我們已經在 Elasticsearch 中存儲了一些數據, 接下來就能專注於實現應用的業務需求了。

1)第一個需求是可以檢索到單個雇員的數據。

GET /megacorp/employee/1
 
將 HTTP 命令由 PUT 改為 GET 可以用來檢索文檔,同樣的,可以使用 DELETE 命令來刪除文檔,以及使用 HEAD 指令來檢查文檔是否存在。如果想更新已存在的文檔,只需再次 PUT 

 

2)我們使用下列請求來搜索所有雇員

GET /megacorp/employee/_search
 
3)接下來,嘗試下搜索姓氏為 ``Smith`` 的雇員。為此,我們將使用一個 高亮 搜索,很容易通過命令行完成。這個方法一般涉及到一個 查詢字符串 (_query-string_) 搜索
GET /megacorp/employee/_search?q=last_name:Smith
 
我們仍然在請求路徑中使用 _search 端點,並將查詢本身賦值給參數 q= 。返回結果給出了所有的 Smith
 

4)Query-string 搜索通過命令非常方便地進行臨時性的即席搜索 ,但它有自身的局限性(參見 輕量 搜索)。Elasticsearch 提供一個豐富靈活的查詢語言叫做 查詢表達式 , 它支持構建更加復雜和健壯的查詢。

領域特定語言 (DSL), 指定了使用一個 JSON 請求。我們可以像這樣重寫之前的查詢所有 Smith 的搜索 :

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}
這個請求使用 JSON 構造,並使用了一個 match 查詢
 

5)更復雜的搜索

現在嘗試下更復雜的搜索。 同樣搜索姓氏為 Smith 的雇員,但這次我們只需要年齡大於 30 的。查詢需要稍作調整,使用過濾器 filter ,它支持高效地執行一個結構化查詢。

GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}

 

 

這部分與我們之前使用的 match 查詢 一樣。

 

這部分是一個 range 過濾器 , 它能找到年齡大於 30 的文檔,其中 gt 表示_大於(_great than)。

目前無需太多擔心語法問題,后續會更詳細地介紹。只需明確我們添加了一個 過濾器 用於執行一個范圍查詢,並復用之前的 match 查詢。現在結果只返回了一個雇員,叫 Jane Smith,32 歲。

 

 

6)全文搜索

截止目前的搜索相對都很簡單:單個姓名,通過年齡過濾。現在嘗試下稍微高級點兒的全文搜索——一項傳統數據庫確實很難搞定的任務。

搜索下所有喜歡攀岩(rock climbing)的雇員:

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

顯然我們依舊使用之前的 match 查詢在about 屬性上搜索 “rock climbing” 。得到兩個匹配的文檔:

{
   ...
   "hits": {
      "total":      2,
      "max_score":  0.16273327,
      "hits": [
         {
            ...
            "_score":         0.16273327, 
            "_source": {
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            }
         },
         {
            ...
            "_score":         0.016878016, 
            "_source": {
               "first_name":  "Jane",
               "last_name":   "Smith",
               "age":         32,
               "about":       "I like to collect rock albums",
               "interests": [ "music" ]
            }
         }
      ]
   }
}

 

相關性得分

Elasticsearch 默認按照相關性得分排序,即每個文檔跟查詢的匹配程度。第一個最高得分的結果很明顯:John Smith 的 about 屬性清楚地寫着 “rock climbing” 。

但為什么 Jane Smith 也作為結果返回了呢?原因是她的 about 屬性里提到了 “rock” 。因為只有 “rock” 而沒有 “climbing” ,所以她的相關性得分低於 John 的。

這是一個很好的案例,闡明了 Elasticsearch 如何  全文屬性上搜索並返回相關性最強的結果。Elasticsearch中的 相關性 概念非常重要,也是完全區別於傳統關系型數據庫的一個概念,數據庫中的一條記錄要么匹配要么不匹配。

 

7)短語搜索

找出一個屬性中的獨立單詞是沒有問題的,但有時候想要精確匹配一系列單詞或者短語 。 比如, 我們想執行這樣一個查詢,僅匹配同時包含 “rock”  “climbing” ,並且 二者以短語 “rock climbing” 的形式緊挨着的雇員記錄。

為此對 match 查詢稍作調整,使用一個叫做 match_phrase 的查詢:

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

 

 

8)高亮搜索

許多應用都傾向於在每個搜索結果中 高亮 部分文本片段,以便讓用戶知道為何該文檔符合查詢條件。在 Elasticsearch 中檢索出高亮片段也很容易。

再次執行前面的查詢,並增加一個新的 highlight 參數:

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}
 

當執行該查詢時,返回結果與之前一樣,與此同時結果中還多了一個叫做 highlight 的部分。這個部分包含了 about 屬性匹配的文本片段,並以 HTML 標簽 <em></em> 封裝:

 

9)分析聚合

終於到了最后一個業務需求:支持管理者對雇員目錄做分析。 Elasticsearch 有一個功能叫聚合(aggregations,允許我們基於數據生成一些精細的分析結果。聚合與 SQL 中的 GROUP BY 類似但更強大。

舉個例子,挖掘出雇員中最受歡迎的興趣愛好:

先開啟

PUT megacorp/_mapping/employee/
{
  "properties": {
    "interests": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

 

執行

GET /megacorp/employee/_search
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}

 

暫時忽略掉語法,直接看看結果:

{
   ...
   "hits": { ... },
   "aggregations": {
      "all_interests": {
         "buckets": [
            {
               "key":       "music",
               "doc_count": 2
            },
            {
               "key":       "forestry",
               "doc_count": 1
            },
            {
               "key":       "sports",
               "doc_count": 1
            }
         ]
      }
   }
}

可以看到,兩位員工對音樂感興趣,一位對林地感興趣,一位對運動感興趣。這些聚合並非預先統計,而是從匹配當前查詢的文檔中即時生成。如果想知道叫 Smith 的雇員中最受歡迎的興趣愛好,可以直接添加適當的查詢來組合查詢:

GET /megacorp/employee/_search
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}

all_interests 聚合已經變為只包含匹配查詢的文檔:

  ...
  "all_interests": {
     "buckets": [
        {
           "key": "music",
           "doc_count": 2
        },
        {
           "key": "sports",
           "doc_count": 1
        }
     ]
  }

聚合還支持分級匯總 。比如,查詢特定興趣愛好員工的平均年齡:

GET /megacorp/employee/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}

 

得到的聚合結果有點兒復雜,但理解起來還是很簡單的:

  ...
  "all_interests": {
     "buckets": [
        {
           "key": "music",
           "doc_count": 2,
           "avg_age": {
              "value": 28.5
           }
        },
        {
           "key": "forestry",
           "doc_count": 1,
           "avg_age": {
              "value": 35
           }
        },
        {
           "key": "sports",
           "doc_count": 1,
           "avg_age": {
              "value": 25
           }
        }
     ]
  }

輸出基本是第一次聚合的加強版。依然有一個興趣及數量的列表,只不過每個興趣都有了一個附加的 avg_age 屬性,代表有這個興趣愛好的所有員工的平均年齡。

即使現在不太理解這些語法也沒有關系,依然很容易了解到復雜聚合及分組通過 Elasticsearch 特性實現得很完美。可提取的數據類型毫無限制。

 

教程結語

這是一個關於 Elasticsearch 基礎描述的教程,且僅僅是淺嘗輒止,更多諸如 suggestions、geolocation、percolation、fuzzy 與 partial matching 等特性均被省略,以便保持教程的簡潔。但它確實突顯了開始構建高級搜索功能多么容易。不需要配置——只需要添加數據並開始搜索!

 

刪除索引

DELETE    megacorp

 

其他的一些操作命令

按時間查詢日志(國際時間)

Try a test query to Elasticsearch based on the fields created by the grok filter plugin. Replace $DATE with the current date, in YYYY.MM.DD format:

curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=response=200'
例如 http://10.6.129.101:9200/logstash-2017.08.12/_search?pretty&q=host=10.33.42.212
其中 host=xxx可替換為host:xxx

 

按城市名稱查詢

curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=geoip.city_name=Buffalo'
 

Logstash 介紹

 

Logstash 是一款強大的數據處理工具,它可以實現數據傳輸,格式處理,格式化輸出,還有強大的插件功能,常用於日志處理(運行環境jvm 8)

 

官網地址:https://www.elastic.co/products/logstash

官方文檔:https://www.elastic.co/guide/en/logstash
 
Logstash管道有兩個必需的元素,input output,以及一個可選的元素,filter。輸入插件消費源數據,過濾器插件會按照你指定的方式修改數據,輸出插件將數據寫入到目的地(查看logstash安裝了哪些插件./bin/logstash-plugin list)。配置模板
input {{
}}
 
filter { filter {
 
}}
output {{
}}
 
示例 參見虛擬機10.6.129.101配置示例。

 

工作流程

 

 

 

Logstash 工作的三個階段:

 

input 數據輸入端,可以接收來自任何地方的源數據。

  • file:從文件中讀取
  • syslog:監聽在514端口的系統日志信息,並解析成RFC3164格式。
  • redis:從redis-server list 中獲取
  • beat:接收來自Filebeat的事件

 

Filter 數據中轉層,主要進行格式處理,數據類型轉換、數據過濾、字段添加,修改等,常用的過濾器如下。

  • grok: 通過正則解析和結構化任何文本。Grok 目前是logstash最好的方式對非結構化日志數據解析成結構化和可查詢化。logstash內置了120個匹配模式,滿足大部分需求。
  • mutate: 在事件字段執行一般的轉換。可以重命名、刪除、替換和修改事件字段。
  • drop: 完全丟棄事件,如debug事件。
  • clone: 復制事件,可能添加或者刪除字段。
  • geoip: 添加有關IP地址地理位置信息。

 

output 是logstash工作的最后一個階段,負責將數據輸出到指定位置,兼容大多數應用,常用的有:

  • elasticsearch: 發送事件數據到 Elasticsearch,便於查詢,分析,繪圖。
  • file: 將事件數據寫入到磁盤文件上。
  • mongodb:將事件數據發送至高性能NoSQL mongodb,便於永久存儲,查詢,分析,大數據分片。
  • redis:將數據發送至redis-server,常用於中間層暫時緩存。
  • graphite: 發送事件數據到graphite,用於存儲和繪制指標的流行開源工具。http://graphite.wikidot.com/
  • statsd: 發送事件數據到 statsd。

Codecs編解碼器

編解碼器可以作為輸入的流過濾器。編解碼器使您可以輕松地將郵件的傳輸與序列化過程分開。流行的編解碼器包括jsonmsgpackplain (文本)。

 

簡單的兩種測試輸入輸出的配置

測試您的Logstash,運行最基本的Logstash管道。

1)例如:shell標准輸入數據

cd logstash-5.5.1 
bin / logstash -e'input {stdin {}} output {stdout {}}'
 
2)或 端口輸入,stdout輸出
input {
    beats {
        port => "5043"
    }
}
output {
    stdout { codec => rubydebug }
}
 

驗證配置文件是否正確 和配置自動加載

bin/logstash -f first-pipeline.conf --config.test_and_exit
 
bin/logstash -f first-pipeline.conf --config.reload.automatic

--config.reload.automatic選項啟用自動配置重新加載,以便您每次修改配置文件時不必停止並重新啟動Logstash。

 

Grok 結構化數據

過濾器插件使您能夠將非結構化日志數據進行結構化  參見演示平台logstash 配置

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}

 

 

刪除注冊文件,讓filebeat 重新讀取日志

sudo rm data/registry

 

geoip  補充ip信息  需下載geoip數據庫,或機器能連網

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    geoip {
        source => "clientip"
    }
}
 
logstash配置文件基礎語法:
https://www.elastic.co/guide/en/logstash/5.5/event-dependent-configuration.html
 

Grok 使用語法

 

https://www.elastic.co/guide/en/logstash/5.5/plugins-filters-grok.html

解析任意文本和結構。

Grok目前是logstash中將最壞的非結構化日志數據解析為結構化和可查詢的最佳方式。

此工具非常適用於syslog日志,apache和其他Web服務器日志,mysql日志以及通常為人類而不是計算機消費而編寫的任何日志格式。

默認情況下,Logstash約有120種模式。你可以在這里找到他們:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns。你可以自己加入。(見patterns_dir設定)

如果您需要幫助構建模式以匹配您的日志,您會發現 http://grokdebug.herokuapp.comhttp://grokconstructor.appspot.com/應用程序非常有用!

基本演示: 訪問http://grokdebug.herokuapp.com/

日志:

55.3.244.1 GET /index.xml 15824 0.043

pattern:

%{IPV4:client} %{WORD:method} %{URIPATH:uri} %{INT:datalength} %{BASE16FLOAT:timecost}

輸出:

寫成配置:

input {

  file {

    path => "/var/log/http.log"

  }

}

filter {

  grok {

match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }

remove_field => [ "message" ]

 

  }

}

 

 

 

filebeat 配置 fields type

  • multiline:將多行文本事件(如java異常和堆棧跟蹤)消息合並到一個事件中。

 

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/*.log 
  fields:
    type: syslog 
output.logstash:
  hosts: ["localhost:5043"]
 
 
logstash 配置 input tritter ,out put file,其中output:elasticsearch 可以填寫集群多個節點,自動負載均衡。端口可以不填,默認9200
 
input {
    twitter {
        consumer_key => "enter_your_consumer_key_here"
        consumer_secret => "enter_your_secret_here"
        keywords => ["cloud"]
        oauth_token => "enter_your_access_token_here"
        oauth_token_secret => "enter_your_access_token_secret_here"
    }
    beats {
        port => "5043"
}

file {

    path => “/var/log/ apache/ access.log”

    type => “apache” }

 
}
output {
    elasticsearch {
        hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
    }
    file {
        path => "/path/to/target/file"
    }
}
 
elsaticsearch 查詢 上面配置的filed type :
curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=fields.type:syslog'
 
查詢推特信息
curl -XGET 'http://localhost:9200/logstash-$DATE/_search?pretty&q=client:iphone'
 
 
 
 

后台運行logstash

logstash 啟停 /etc/init.d/logstash start
# 通過這種方式啟動,logstash會自動加載 /etc/logstash/conf.d/ 下的配置文件
 

或后台命令行運行:

nohup /usr/share/logstash/bin/logstash -f /usr/share/logstash/bin/logstash.conf  &>/dev/null &

 

 

哈希

哈希是以格式指定的鍵值對的集合"field1" => "value1"。請注意,多個鍵值條目由空格分隔,而不是逗號。

例:

match => { “field1” => “value1” “field2” => “value2” ... } 
    
    
 
 
output  -elasticsearch
https://www.elastic.co/guide/en/logstash/5.5/plugins-outputs-elasticsearch.html
 

index

  • 值類型是字符串
  • 默認值為 "logstash-%{+YYYY.MM.dd}"
  • 值類型是字符串
  • 此設置沒有默認值。
 

id

添加一個獨特ID的插件配置。如果沒有指定ID,Logstash將生成一個。強烈建議您在配置中設置此ID。當您有兩個或多個相同類型的插件時,例如,如果您有2個Grok過濾器,則此功能特別有用。在這種情況下添加命名ID將有助於在使用監視API時監視Logstash。

輸出{
 stdout {
   id =>“my_plugin_id”
 }
}
 
  

 

 

nginx 實戰 比較全面的一個示例

 
參考文檔http://tchuairen.blog.51cto.com/3848118/1840596/
 

1)注意事項:

其中nginx 日志改json 格式的方法: 在http 域內 定義名為json的log_format 格式,然后指定日志文件access.log使用該格式:
access_log  logs/access.log  json;
 
最后重新加載,或重啟nginx 以生效
 
如下:
 
http {
    log_format json '{"@timestamp":"$time_iso8601",'
                 '"slbip":"$remote_addr",'
                 '"clientip":"$http_x_forwarded_for",'
                 '"serverip":"$server_addr",'
                 '"size":$body_bytes_sent,'
                 '"responsetime":$request_time,'
                 '"domain":"$host",'
                 '"method":"$request_method",'
                 '"requesturi":"$request_uri",'
                 '"url":"$uri",'
                 '"appversion":"$HTTP_APP_VERSION",'
                 '"referer":"$http_referer",'
                 '"agent":"$http_user_agent",'
                 '"status":"$status"}';
 
access_log  logs/access.log  json;
 
 
- input_type: log
  paths:
    - /usr/local/openresty/nginx/logs/access.log
  fields:
    type: nginxacclog
  fields_under_root: true

 

 

2)grok匹配pandora 日志 示例:

.2017-08-13 12:42:25.112 MsgProcessThread-4 org.springframework.web.servlet.mvc.method INFO - ping from [/10.33.25.215:41542]

 

%{TIMESTAMP_ISO8601:time} %{USERNAME :thread} %{USERNAME:classpath} %{LOGLEVEL:loglevel} - %{GREEDYDATA:data}

 

logstash if else 語法

if EXPRESSION {

  ...

} else if EXPRESSION {

  ...

} else {

  ...

}

 

kibana 基本操作

 

 

 

Discover  對日志進行檢索查看

 

Visuallize  圖表可視化 配置;對特定規則聚合的數據進行圖表分析

 

Dashboard  將Visualize設置的圖表展示成儀表盤,有分組功能

 

Timelion   默認顯示的.es(*) 為 es 文檔個數

 

Dev Tools  一個RestAPI Console  與elasticsearch 進行交互

 

Management  創建管理索引的地方  以及 其他 的高級設置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM