ELK分析nginxのログ(2)

1、ES基本操作

Elasticsearchコンセプト

  1. インデックス - > MySQLデータベース内に類似

  2. タイプ - >データテーブルと類似のMysql

  3. ドキュメント - >データストレージ

ES&kibana

Webインターフェイスのテスト

  1. ブラウザアクセス

  2. Kibana処置:GET /以下に示すような効果が現れ、と説明kibanaは成功したリンケージをES。

インデックスの操作

//创建索引
PUT /zhang

//删除索引: 
DELETE /zhang

//获取所有索引: 
GET /_cat/indices?v

CRUD

ESデータの挿入

PUT /zhang/users/1
{
 "name":"zhanghe", 
 "age": 23
}

ESクエリデータ

GET /zhang/users/1
GET /zhang/_search?q=*

変更データは、被覆

PUT /zhang/users/1
{
 "name": "justdoit",
 "age": 21
}

ES削除データ

DELETE /zhang/users/1

フィールドを変更し、カバーしていません

POST /zhang/users/1/_update
{
 "doc": {
  "age": 22
 }
}

すべてのデータを変更します

POST /zhang/_update_by_query
{
 "script": {
  "source": "ctx._source['age']=30" 
 },
 "query": {
  "match_all": {}
 }
}

フィールドを追加します。

POST /zhang/_update_by_query
{
 "script":{
  "source": "ctx._source['city']='hangzhou'"
 },
 "query":{
  "match_all": {}
 }
}

そして、上記の方法は、ほとんどのちょうどすることができます知っている、運転中に私たちの運転・保守要員の多くを使用していません。

3、nginxの

カスタム抽出フィールド

全体は、切断されていない、我々は正規表現でnginxのログにカットする必要がされてkibanaディスプレイにログオンNginxは、内容に基づいている正規表現とnginxのログの内容、に精通して、私たちを必要とし、これらはもはやありません繰り返します。

GROKエキスnginxのログ

1、GROKの使用(? xxxのフィールドを抽出するための抽出分)

2、クライアントのIPを抽出しますか(? [0-9] {1,3}。[0-9] {1,3}。[0-9] {1,3}。[0-9] {1,3})

3、抽出時間:[(? [^] + + [0-9] +)]

GROKエキスnginxのログ

(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"

ログTomcatを抽出するなどA同様のアプローチ

Logstash定期抽出nginxのログ

input {
 file {
  path => "/var/log/nginx/access.log"
 }
}
filter {
  grok {
    match => {
     "message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"'
    } 
  }
}
output {
 elasticsearch {
  hosts => ["http://192.168.80.20:9200"]
 }
}

Logstash通常の抽出誤差がESに出力されません

echo "shijiange" >> /usr/local/nginx/logs/access.log
output{
  if "_grokparsefailure" not in [tags] and "_dateparsefailure" not in [tags] {
​    elasticsearch {
​      hosts => ["http://192.168.237.50:9200"]
​    }
  }
}

次のようにエフェクトショットは、より多くのカスタムフィールドです。

フィールドを削除します

私たちは、プロファイルフィールドは、メッセージの分割が終わって、そしてESは、我々は削除することができ、メッセージを終了して、インフォメーションストアのダウンを完了する必要はありませんそれらを与えたlogstash。

フィールドの除去に注意してください。

  1. それだけで_sourceで削除することができます

  2. 非_sourceに削除することはできません

不要な削除するLogstash設定フィールド

filter {
  grok {
    match => {
        "message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"'
    }
     remove_field => ["message","@version","path"]
  }
}

メリットフィールドの除去:

ESは、データベースのサイズを縮小します

検索効率を向上させます

タイムライン

ELKデフォルトのタイムライン

  1. ログを送信するための時間が優先されるもの

  2. Nginxは自身とユーザーのアクセス時間の記録

  3. 分析nginxのログを送信する時間なしに、時間に基づいて、ユーザのアクセスにログオン

Logstash默认是只是会记录最新出现的的日志,以往的日志并不会发送到ES上,但是如果我们有这个需求,要进行一个全量的分析,也是可以的:

input {
 file {
  path => "/usr/local/nginx/logs/access.log"
  start_position => "beginning"
  sincedb_path => "/dev/null"
 }
}

记录日志的时间和日志发送到ES的时候是不一致的,而kibana只会根据发送的发送的时间呈现图表,这不方便我们观看,所以我们要用日志里面的时间覆盖日志发送到ES的时间,这样图表呈现出来时才符合我们的需求。

Logstash的filter里面加入配置24/Feb/2019:21:08:34 +0800

filter {
  grok {
​    match => {
​      "message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"'
​    }
​    remove_field => ["message","@version","path"]
  }
  date {
​    match => ["requesttime", "dd/MMM/yyyy:HH:mm:ss Z"]
​    target => "@timestamp"
  }
}

统计Nginx的请求和网页显示进行对比

cat /usr/local/nginx/logs/access.log |awk '{print $4}'|cut -b 1-19|sort |uniq -c

不同的时间格式,覆盖的时候格式要对应

20/Feb/2019:14:50:06 -> dd/MMM/yyyy:HH:mm:ss
2016-08-24 18:05:39,830 -> yyyy-MM-dd HH:mm:ss,SSS

おすすめ

転載: www.cnblogs.com/yizhangheka/p/12236167.html