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 とソース コードのコンパイル)

推薦する

Linux での MySQL 5.6.33 のインストールと設定のチュートリアル

このチュートリアルでは、LinuxでのMySQL 5.6.33のインストールと設定方法を参考までに紹...

Centos8 (最小インストール) Python3.8+pip のインストール方法に関するチュートリアル

Python8のインストールを最小化した後、Python3.8.1をインストールしました。オンライン...

jsは動的にテーブルを生成します(ノード操作)

この記事の例では、テーブルを動的に生成するjsの具体的なコードを参考までに共有しています。具体的な内...

Unicodeの一般的な記号

Unicode は、世界中のすべてのテキストと記号に対応できる国際組織によって開発された文字エンコー...

MySQLデータベースに接続し、クエリ操作を実行するためのIDEAの完全なコード

1.まずMysqlリンク設定ページを書く パッケージ com.wretchant.fredis.me...

星のフラッシュ効果を実現するjs

この記事の例では、スターフラッシュ効果を実現するためのjsの具体的なコードを参考までに共有しています...

mysql8.0.23 msi インストールの超詳細なチュートリアル

1.MySqlをダウンロードしてインストールする公式ウェブサイトからMySqlデータベースをダウンロ...

MySQL実行計画の詳細な説明

EXPLAIN ステートメントは、MySQL がステートメントを実行する方法に関する情報を提供します...

HTML ページをズームアウトした後にスクロール バーを表示するためのサンプル コード

ここでは、HTML ページのサイズを縮小した後に下部にスクロール バーを表示し、スクロール バーをス...

JavaScript ドラッグタイム ドラッグケースの詳細な説明

目次DragEvent インターフェースデータ転送インターフェースの概要DataTransfer の...

MySQLはOracleシーケンスに似たソリューションを実装しています

MySQLはOracleのようなシーケンスを実装しているOracle は通常、主キー フィールドを処...

MySQLのロックについて理解しておくべきこと

1. はじめにMySQL ロックは、その範囲に応じて、グローバル ロック、テーブル ロック、行ロック...

シンプルなショッピングカートの最も完全なコード分析を実装する JavaScript (ES6 オブジェクト指向)

この記事では、シンプルなショッピングカートを実装するためのJavaScriptの具体的なコードを参考...

ウェブページでよく使用される共有コードの完全なリスト(フロントエンドに必須)

コードをコピーコードは次のとおりです。 1. 新浪微博<a href="http:/...