nginx ログを elasticsearch にインポートする方法の例

nginx ログを elasticsearch にインポートする方法の例

nginx ログは filebeat によって収集され、logstash に渡され、logstash によって処理された後、elasticsearch に書き込まれます。 Filebeat は収集作業のみを担当し、logstash はログを elasticsearch に書き込んだ後、ログのフォーマット、データの置換、分割、インデックスの作成を完了します。

1. nginxログフォーマットを設定する

log_format main '$remote_addr $http_x_forwarded_for [$time_local] $server_name $request ' 
            '$status $body_bytes_sent $http_referer ' 
            '"$http_user_agent" '
            '"$接続"'
            '"$http_cookie"'
            '$リクエスト時間'
            '$upstream_response_time';

2. Filebeatをインストールして設定し、nginxモジュールを有効にする

tar -zxvf filebeat-6.2.4-linux-x86_64.tar.gz -C /usr/local
cd /usr/local;ln -s filebeat-6.2.4-linux-x86_64 ファイルビート
cd /usr/local/filebeat

nginxモジュールを有効にする

./filebeatモジュールはnginxを有効にする

モジュールを表示

./filebeat モジュールリスト

設定ファイルを作成する

vim /usr/local/filebeat/blog_module_logstash.yml
ファイルビートモジュール:
- モジュール: nginx
 アクセス:
  有効: true
  var.paths: ["/home/weblog/blog.cnfol.com_access.log"]
 #エラー:
 # 有効: true
 # 変数パス: ["/home/weblogerr/blog.cnfol.com_error.log"]


出力.logstash:
 ホスト: ["192.168.15.91:5044"]

ファイルビートを開始

./filebeat -c blog_module_logstash.yml -e

3.logstashを設定する

tar -zxvf logstash-6.2.4.tar.gz /usr/local
cd /usr/local;ln -s logstash-6.2.4 logstash
nginx ログのパイプラインファイルを作成する cd /usr/local/logstash

Logstash 組み込みテンプレート ディレクトリ

ベンダー/バンドル/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns

grok-patternsを編集し、複数のIPをサポートする通常のパターンを追加します。

転送 (?:%{IPV4}[,]?[ ]?)+|%{WORD}

公式グロク

http://grokdebug.herokuapp.com/patterns#

logstashパイプライン設定ファイルを作成する

#入力{
# 標準入力 {}
#}
# ファイルビートからのデータ入力を受け入れる {
 ビート {
 ポート => 5044
 ホスト => "0.0.0.0"
 }
}

フィルター {
 # デバッグスイッチを追加します mutate{add_field => {"[@metadata][debug]"=>true}}
 理解する {
 # nginx ログをフィルタリング #match => { "message" => "%{NGINXACCESS_TEST2}" }
 #match => {"message" => '%{iporhost:clientip}#(?<http_x_forwarded_for> [^\#]*)番号:httpversion}#%{number:response}#(?:%:bytes} |  - ) %{number:connection} |  - )#(?: "(?<cookies> [^#]*)")
 #match => {"message" => '(?:%{iporhost:clientip} |  - )(?:%{two_ip:http_x_forwarded_for} |%{ipv4:http_x_forwarded_for} |  - )\ [%{httpdate:[webtime](? } |  - )%{word:method}%{uripathparam:request} http/%{number:httpversion}%{number:response}(?:%{number:bytes} |  - )(?番号:connection} |  - ) "|%{number:connection} |  - )(?:"(?<cookies> [^#]*) ")%{number:request_time:float}(?:%{number:upstream_response_time:float} |  - ) '}}
    match => {"message" => '(?:%{iporhost:clientip} |  - )%{forword:http_x_forwarded_for} \ [%{httpdate:[@metadata] [webtime]} \](? {number:httpversion}%{number}(?:%:bytes} |  - )(?: "(?:notspace:referrer} |  -  {notspace:referrer} |  - )%{qs:agent}(? %{number:request_time:float}(?:%{number:upstream_response_time:float} |  - ) '}
 }
 # デフォルトの@timestamp(beatsがログを収集した時間)値を新しいフィールド@read_tiimestampに割り当てます
 ルビー{ 
 #コード => "event.set('@read_timestamp',event.get('@timestamp'))"
 # タイムゾーンを East 8 に変更します。コード => "event.set('@read_timestamp',event.get('@timestamp').time.localtime + 8*60*60)"
 }
 # nginx ログ記録時間をフォーマットします # 時間をフォーマットします 20/May/2015:21:05:56 +0000
 日付 {
 ロケール => "en"
 一致 => ["[@metadata][webtime]","dd/MMM/yyyy:HH:mm:ss Z"]
 }
 # バイトフィールドを文字列から数値に変換する mutate {
 変換 => {"バイト" => "整数"}
 }
 # クッキーフィールドをJSONに解析する
 #変異 {
 # gsub => ["cookies",'\;',',']
 #} 
 # CDN アクセラレーションが使用されている場合、http_x_forwarded_for には複数の IP アドレスが存在します。最初の IP アドレスはユーザーの実際の IP アドレスです。
 if[http_x_forwarded_for] =~ ", "{
     ルビー{
         コード => 'event.set("http_x_forwarded_for", event.get("http_x_forwarded_for").split(",")[0])'
        }
    }
 # IPアドレスを解析し、IPアドレスの地理的位置を取得します。geoip {
 ソース => "http_x_forwarded_for"
 # # IP の緯度と経度、国、都市、タイムゾーンのフィールドのみを取得します => ["location","country_name","city_name","re​​gion_name"] 
 }
 # エージェントフィールドを解析してブラウザやシステムバージョンなどの特定の情報を取得します useragent {
 ソース => "エージェント"
 ターゲット => "ユーザーエージェント"
 }
 #削除するデータを指定する#mutate{remove_field=>["message"]}
 # ログ名に応じてインデックス名のプレフィックスを設定するruby ​​{
 コード => 'event.set("@[metadata][index_pre]",event.get("source").split("/")[-1])'
 } 
 # @timestamp を 2019.04.23 にフォーマットします
 ルビー{
 コード => 'event.set("@[metadata][index_day]",event.get("@timestamp").time.localtime.strftime("%Y.%m.%d"))'
 }
 # 出力のデフォルトのインデックス名を設定する mutate {
 追加フィールド => {
  #"[@metadata][index]" => "%{@[metadata][index_pre]}_%{+YYYY.MM.dd}"
  "[@metadata][index]" => "%{@[metadata][index_pre]}_%{@[metadata][index_day]}"
 }
 }
 # クッキーフィールドをJSONに解析する
# 変異 {
# gsub => [
# "クッキー", ";", ",",
# "クッキー", "=", ":"
# ]
# #split => {"cookies" => ","}
# }
# json_encode {
# ソース => "cookies"
# ターゲット => "cookies_json"
# }
# 変異 {
# gsub => [
# "cookies_json", ',', '","',
# "cookies_json", ':', '":"'
# ]
# }
# json {
# ソース => "cookies_json"
# ターゲット => "cookies2"
# }
 # grok解析でエラーが発生した場合、エラーを別のインデックスに書き込みます if "_grokparsefailure" in [tags] {
 #if "_dateparsefailure" in [タグ] {
 変異 {
  置換 => {
  #"[@metadata][index]" => "%{@[metadata][index_pre]}_failure_%{+YYYY.MM.dd}"
  "[@metadata][index]" => "%{@[metadata][index_pre]}_failure_%{@[metadata][index_day]}"
  }
 }
 # エラーがない場合はメッセージを削除します
 }それ以外{
 mutate{remove_field=>["メッセージ"]}
 }
}

出力{
 [@metadata][debug]{の場合
 # ruby​​debuyg に出力し、メタデータを出力する
 stdout{codec => ruby​​debug{metadata => true}}
 }それ以外{
 # 出力内容を「.」に変換します。
 stdout{コーデック => ドット} 
 # 指定されたesに出力
 エラスティックサーチ
  ホスト => ["192.168.15.160:9200"]
  インデックス => "%{[@metadata][index]}"
  ドキュメントタイプ => "doc"
 } 
 }
}

ログスタッシュを起動する

nohup bin/logstash -f test_pipline2.conf &

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ELK を使用して Nginx サーバー ログを分析する方法の詳細な説明
  • Nginx ログの日付別カット(日別カット)の詳しい説明
  • nginx ログカットシェルスクリプト
  • nginx で JSON 形式でログを記録する設定例
  • nginx ログのアクセス時間と最も時間のかかるページ (遅いクエリ) のシェル スクリプト分析
  • Nginx ログを定期的に自動削除する方法
  • Windows での Nginx ログ処理スクリプト
  • Pythonはnginxログファイルを解析します

<<:  JSはキャンバス技術を使用してeChartsの棒グラフを模倣します

>>:  Linux に MySQL をインストールする方法 (yum とソース コードのコンパイル)

推薦する

MySQL CHARとVARCHARの選択方法

目次VARCHAR 型と CHAR 型結論: VARCHAR 型と CHAR 型VARCHAR と ...

Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法

Docker コンテナでユーザーを切り替えると、権限が不十分であるというメッセージが表示されます。解...

M1 チップに MySQL 8.0 データベースをインストールする方法 (画像とテキスト)

1. ダウンロードまず、MySQLの国内ミラーをお勧めします。特に速いわけではありませんが、それで...

高速でクールな揺れアニメーション効果を実現するCSS

1. Animate.css の紹介Animate.css は、Web プロジェクトですぐに使用で...

css3 flexレイアウト justify-content:space-between 最後の行は左揃えになります

justify-content:space-betweenレイアウトを使用する場合、要素の最後の行に...

HTML 初心者のためのベストプラクティス 15 選

HTML 初心者向けのベストプラクティスを 30 個紹介します。 1. タグを閉じたままにする過去に...

CSS 配置レイアウト (位置、配置レイアウト スキル)

1. ポジショニングとは何ですか? CSS の position 属性には、absolute/re...

Vue3はフロントエンドのログを出力するためにaxiosインターセプターを使用する

目次1. はじめに2. axiosインターセプターを使用してフロントエンドログを出力する1. はじめ...

ネイティブ JavaScript メッセージボード

この記事では、参考までにメッセージボードを実装するためのJavaScriptの具体的なコードを紹介し...

HTML 選択タグにリンクを追加する 3 つの方法

最初のもの:コードをコピーコードは次のとおりです。 <html> <ヘッド>...

CSS グラデーション効果の概要 (線形グラデーションと放射状グラデーション)

線形グラデーション 背景画像: linear-gradient(方向、開始色、中間色1、中間色2、....

JavaScript における call、apply、bind の実装原則の詳細な説明

目次序文電話使用法成し遂げるシンプルな実装バージョン:アップグレード版:適用する使用法成し遂げるバイ...

画像のフェードインとフェードアウト効果を実現する js

この記事では、画像のフェードインとフェードアウトを実現するためのjsの具体的なコードを参考までに紹介...

ウェブサイトを構築するときは、UTF-8 または GB2312 エンコードを使用する必要がありますか?

外国のウェブサイトを開くと文字化けした文字が表示されることが多く、また、英語以外の外国のウェブサイト...

Docker+gitlab+jenkins は、ゼロから自動デプロイメントを構築します

目次序文: 1. Dockerをインストールする2. DockerでJenkinsをインストールする...