1、ES基本操作
Elasticsearchコンセプト
インデックス - > MySQLデータベース内に類似
タイプ - >データテーブルと類似のMysql
ドキュメント - >データストレージ
ES&kibana
Webインターフェイスのテスト
ブラウザアクセス
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の使用(?
2、クライアントのIPを抽出しますか(?
3、抽出時間:[(?
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。
フィールドの除去に注意してください。
それだけで_sourceで削除することができます
非_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デフォルトのタイムライン
ログを送信するための時間が優先されるもの
Nginxは自身とユーザーのアクセス時間の記録
分析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