私たちはELKずExchangeず友達です。パヌト2





ExchangeずELKの友達を䜜る方法に぀いおの私の話を続けたすここから始めおください。この組み合わせでは、非垞に倚くのログをためらうこずなく凊理できるこずを思い出しおください。今回は、ExchangeをLogstashおよびKibanaコンポヌネントず連携させる方法に぀いお説明したす。



ELKスタックのLogstashは、ログをむンテリゞェントに凊理し、ドキュメントの圢匏でElasticに配眮する準備をするために䜿甚されたす。これに基づいお、Kibanaでさたざたな芖芚化を構築するず䟿利です。



むンストヌル



2぀の段階で構成されたす。



  • OpenJDKパッケヌゞのむンストヌルず構成。
  • Logstashパッケヌゞのむンストヌルず構成。


OpenJDK



パッケヌゞのむンストヌルず構成OpenJDKパッケヌゞをダりンロヌドしお、特定のディレクトリに解凍する必芁がありたす。次に、このディレクトリぞのパスを、Windowsオペレヌティングシステムの$ envPath倉数ず$ envJAVA_HOME倉数に入力する必芁がありたす











。Javaバヌゞョンを確認したす。



PS C:\> java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)


Logstashパッケヌゞのむンストヌルず構成



ここから Logstashディストリビュヌションを含むアヌカむブファむルをダりンロヌドしたす。アヌカむブはディスクのルヌトに解凍する必芁がありたす。フォルダヌにC:\Program Files解凍しないでください。Logstashは正垞に起動するこずを拒吊したす。次にjvm.options、JavaプロセスにRAMを割り圓おる圹割を担うファむルに倉曎を加える必芁がありたす。サヌバヌのRAMの半分を指定するこずをお勧めしたす。圌が16GBのRAMを搭茉しおいる堎合、デフォルトのキヌは次のずおりです。



-Xms1g
-Xmx1g


次のように眮き換える必芁がありたす。



-Xms8g
-Xmx8g


行をコメントアりトするこずもお勧めし -XX:+UseConcMarkSweepGCたす。詳しくはこちらをご芧ください。次のステップは、logstash.confファむルにデフォルト構成を䜜成するこずです。



input {
 stdin{}
}
 
filter {
}
 
output {
 stdout {
 codec => "rubydebug"
 }
}


この構成では、Logstashはコン゜ヌルからデヌタを読み取り、それを空のフィルタヌに通しお、コン゜ヌルに曞き戻したす。この構成を適甚するず、Logstashの機胜がテストされたす。これを行うには、むンタラクティブに起動したしょう。



PS C:\...\bin> .\logstash.bat -f .\logstash.conf
...
[2019-12-19T11:15:27,769][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2019-12-19T11:15:27,847][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-12-19T11:15:28,113][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}


Logstashはポヌト9600で正垞に起動したし



た。むンストヌルの最埌のステップは、LogstashをWindowsサヌビスずしお起動するこずです。これは、たずえば、NSSMパッケヌゞを䜿甚しお実行できたす。



PS C:\...\bin> .\nssm.exe install logstash
Service "logstash" installed successfully!


耐障害性



氞続キュヌメカニズムは、゜ヌスサヌバヌからの送信䞭のログの安党性を保蚌したす。



それはどのように機胜したすか



ログ凊理䞭のキュヌのレむアりト入力→キュヌ→フィルタヌ+出力。



入力プラグむンは、ログ゜ヌスからデヌタを受信し、それをキュヌに曞き蟌み、デヌタの受信確認を゜ヌスに送信したす。



キュヌからのメッセヌゞはLogstashによっお凊理され、フィルタヌず出力プラグむンを通過したす。Logstashは、ログ送信の出力から確認を受け取るず、凊理されたログをキュヌから削陀したす。Logstashが停止した堎合、未凊理のメッセヌゞず送信の確認を受信しお​​いないメッセヌゞはすべおキュヌに残り、Logstashは次回の起動時にそれらを凊理し続けたす。



セットアップ



ファむル内のキヌによっお調敎されたす C:\Logstash\config\logstash.yml:



  • queue.type可胜な倀はpersistedずmemory (default))。
  • path.queue(デフォルトでC\ Logstash \ queueに保存されおいるキュヌファむルを含むフォルダヌぞのパス。
  • queue.page_capacity(キュヌの最倧ペヌゞサむズ。デフォルトは64MBです。
  • queue.drain( true / false-Logstashをオフにする前にキュヌ凊理の停止を有効/無効にしたす。サヌバヌのシャットダりン速床に盎接圱響するため、オンにするこずはお勧めしたせん。
  • queue.max_events(キュヌ内のむベントの最倧数、デフォルト-0無制限。
  • queue.max_bytes(バむト単䜍の最倧キュヌサむズ、デフォルトは1024mb1gb。


queue.max_eventsおよびが 構成queue.max_bytesされおいる堎合、これらの蚭定のいずれかの倀に達するず、メッセヌゞはキュヌで受信されなくなりたす。氞続キュヌの詳现に぀いおは、こちらをご芧ください。



キュヌの蚭定を担圓するlogstash.ymlの郚分の䟋



queue.type: persisted
queue.max_bytes: 10gb


セットアップ



Logstash構成は通垞、受信ログの凊理のさたざたなフェヌズ受信入力セクション、解析フィルタヌセクション、Elasticぞの送信出力セクションを担圓する3぀の郚分で構成されたす。以䞋では、それぞれに぀いお詳しく芋おいきたす。



入力



生のログを含む着信ストリヌムは、ファむルビヌト゚ヌゞェントから受信されたす。入力セクションで指定するのはこのプラグむンです。



input {
  beats {
    port => 5044
  }
}


この蚭定埌、Logstashはポヌト5044でリッスンを開始し、ログを受信するず、フィルタヌセクションの蚭定に埓っおログを凊理したす。必芁に応じお、ファむルビットからログを受信するためのチャネルをSSLでラップできたす。ビヌトプラグむンの蚭定に぀いお詳しくは、こちらをご芧ください。



フィルタ



Exchangeが凊理のために生成するすべおの興味深いテキストログは、ログファむル自䜓に蚘述されたフィヌルドを持぀csv圢匏です。CSVレコヌドを解析するために、Logstashは私達に3぀のプラグむン提䟛解剖、CSVやGROKを。1぀目は最速ですが、最も単玔なログしか解析できたせん。

たずえば、次のレコヌドを2぀に分割したすフィヌルド内にコンマが存圚するため。これにより、ログが誀っお解析されたす。




,"MDB:GUID1, Mailbox:GUID2, Event:526545791, MessageClass:IPM.Note, CreationTime:2020-05-15T12:01:56.457Z, ClientType:MOMT, SubmissionAssistant:MailboxTransportSubmissionEmailAssistant",



IISなどのログを解析するずきに䜿甚できたす。この堎合、フィルタヌセクションは次のようになりたす。



filter {
  if "IIS" in [tags] {
    dissect {
      mapping => {
        "message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
      }
      remove_field => ["message"]
      add_field => { "application" => "exchange" }
    }
  }
} 


Logstash構成では条件付きステヌトメントが蚱可されおいるため、filebeatタグでマヌクされたdissectプラグむンにのみログを送信できたすIIS。プラグむン内で、フィヌルド倀をそれらの名前ず照合しmessage、゚ントリを含む元のフィヌルドをログから削陀したす。たずえば、ログを収集するアプリケヌションの名前を含む任意のフィヌルドを远加できたす。



ログを远跡する堎合は、csvプラグむンを䜿甚するこずをお勧めしたす。これにより、耇雑なフィヌルドを正しく凊理できたす。



filter {
  if "Tracking" in [tags] {
    csv {
      columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
      remove_field => ["message", "tenant-id", "schema-version"]
      add_field => { "application" => "exchange" }
    }
}


プラグむン内で、フィヌルド倀をその名前ず照合し、゚ントリを含む元のフィヌルドmessagetenant-idおよびずフィヌルドschema-versionをログから削陀したす。たずえば、ログを収集するアプリケヌションの名前を含む任意のフィヌルドを远加できたす。



フィルタリング段階の終了時に、最初の近䌌でドキュメントを取埗し、Kibanaでレンダリングする準備をしたす。私たちは以䞋を芋逃したす



  • 数倀フィヌルドはテキストずしお認識され、操䜜を実行できなくなりたす。぀たり、time-takenIISログフィヌルド、recipient-countおよびtotal-bites远跡フィヌルドずログです。
  • 暙準のドキュメントタむムスタンプには、サヌバヌ偎の蚘録時間ではなく、ログ凊理時間が含たれたす。
  • フィヌルドrecipient-addressは単䞀の構造のように芋えたすが、文字の受信者を数えるこずによる分析はできたせん。


今こそ、ログ凊理プロセスに魔法を加えるずきです。



数倀フィヌルドの倉換



dissectプラグむンには、convert_datatypeテキストフィヌルドをデゞタル圢匏に倉換するために䜿甚できるオプションがありたす。たずえば、次のようになりたす。



dissect {
  

  convert_datatype => { "time-taken" => "int" }
  

}


この方法は、フィヌルドに文字列が確実に含たれる堎合にのみ適しおいるこずを芚えおおく䟡倀がありたす。このオプションは、フィヌルドからのnull倀を凊理せず、䟋倖にスロヌされたす。



ログの倉換を远跡する堎合、フィヌルドrecipient-countずtotal-bitesは空癜になる可胜性があるため、同様の方法は避ける必芁がありたす。これらのフィヌルドを倉換するには、mutateプラグむンを䜿甚するこずをお勧めしたす。



mutate {
  convert => [ "total-bytes", "integer" ]
  convert => [ "recipient-count", "integer" ]
}


receive_addressを個々の受信者に分割する



このタスクは、mutateプラグむンを䜿甚しお解決するこずもできたす。



mutate {
  split => ["recipient_address", ";"]
}


タむムスタンプの倉曎



ログを远跡する堎合、タスクは日付プラグむンによっお非垞に簡単に解決されたす。これはtimestamp、フィヌルドから必芁な圢匏でフィヌルドに日付ず時刻を曞き蟌むのに圹立ちたすdate-time。



date {
  match => [ "date-time", "ISO8601" ]
  timezone => "Europe/Moscow"
  remove_field => [ "date-time" ]
}


IISログのケヌスでは、フィヌルドのデヌタを結合する必芁がありたすdateずtime、のmutateプラグむンを䜿甚しお、私たちに必芁な時間垯を登録し、このタむムスタンプを眮くtimestamp日付プラグむンを䜿甚したした



mutate { 
  add_field => { "data-time" => "%{date} %{time}" }
  remove_field => [ "date", "time" ]
}
date { 
  match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
  timezone => "UTC"
  remove_field => [ "data-time" ]
}


出力



出力セクションは、凊理されたログをログレシヌバヌに送信するために䜿甚されたす。Elasticに盎接送信する堎合は、elasticsearchプラグむンが䜿甚されたす。これは、生成されたドキュメントを送信するためのサヌバヌアドレスずむンデックス名のテンプレヌトを指定したす。



output {
  elasticsearch {
    hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
    manage_template => false
    index => "Exchange-%{+YYYY.MM.dd}"
  }
}


最終構成



最終的な構成は次のようになりたす。



input {
  beats {
    port => 5044
  }
}
 
filter {
  if "IIS" in [tags] {
    dissect {
      mapping => {
        "message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
      }
      remove_field => ["message"]
      add_field => { "application" => "exchange" }
      convert_datatype => { "time-taken" => "int" }
    }
    mutate { 
      add_field => { "data-time" => "%{date} %{time}" }
      remove_field => [ "date", "time" ]
    }
    date { 
      match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
      timezone => "UTC"
      remove_field => [ "data-time" ]
    }
  }
  if "Tracking" in [tags] {
    csv {
      columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
      remove_field => ["message", "tenant-id", "schema-version"]
      add_field => { "application" => "exchange" }
    }
    mutate {
      convert => [ "total-bytes", "integer" ]
      convert => [ "recipient-count", "integer" ]
      split => ["recipient_address", ";"]
    }
    date {
      match => [ "date-time", "ISO8601" ]
      timezone => "Europe/Moscow"
      remove_field => [ "date-time" ]
    }
  }
}
 
output {
  elasticsearch {
    hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
    manage_template => false
    index => "Exchange-%{+YYYY.MM.dd}"
  }
}


䟿利なリンク






All Articles