ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

telegraf+influxdb+chronografでログを可視化してみる

こんにちは、ニフクラ技術支援チームです。

システム運用において、ログの管理は重要です。サーバーから出力されるログは状態監視のほか、トラブル調査やセキュリティ確保など、様々な目的で利用されます。

当ブログでは過去に、Splunkによるログの収集・解析fluentdとオブジェクトストレージを使用したログ収集といった、ログ管理に関するtipsをご紹介してきました。

これらに関連し、今回は「ログの可視化」に焦点を当て、telegrafinfluxdbchronografを使用し、収集したログの参照やグラフ化を行ってみたいと思います。この3つのツールはTICKスタックとして定番の組み合わせで、サーバーリソースのグラフ化などによく利用されます。

本記事では、Apache HTTP Serverのアクセスログとニフクラのアクティビティログを対象に検証していきます。

構成イメージ

f:id:TechnicalAccountEngineer:20201002174247p:plain
構成イメージ

前提条件

本ブログは、以下の前提知識がある方を想定しています。

  • ニフクラの基本的なコントロールパネルの操作、サービスの利用に関する知識

  • Linuxの基本的な操作、設定に関する知識

利用リソース

east-11にサーバーを2台作成し、プライベートLANで接続します。

リソース 数量
仮想サーバー(OS:CentOS 8.0) 2
プライベートLAN 1

環境構築

① プライベートLANの作成

ログの転送経路として、プライベートLANを作成します。
本検証ではIPアドレス帯を「192.168.50.0/24」としています。

作成方法の詳細は以下をご参照ください。
クラウドヘルプ(プライベートLAN:作成)

② 仮想サーバーの作成

各サーバーのホスト名と役割は以下の通りです。

ホスト名 役割 プライベートIP
logclient01 ログ収集対象サーバー(アクセスログ出力・転送) 192.168.50.10
logserver01 ログ監視サーバー(アクティビティログ取得・ログ集積・chronograf実行) 192.168.50.20

今回はCentOSを使用しているため、SSHキーの作成が必須となります。
また、本検証ではサーバーに適用するファイアウォールには以下の通信を許可するよう設定しています。

logclient01(ログ収集対象サーバー)

プロトコル ポート 接続元 用途
TCP 22 作業端末のグローバルIPアドレス SSH接続
TCP any 192.168.50.0/24 サーバー間接続

logserver01(ログ監視サーバー)

プロトコル ポート 接続元 用途
TCP 22 作業端末のグローバルIPアドレス SSH接続
TCP 8888 作業端末のグローバルIPアドレス chronograf接続
TCP any 192.168.50.0/24 サーバー間接続

作成方法の詳細は以下をご参照ください。
クラウドヘルプ(SSHキー)
クラウドヘルプ(サーバーの作成)
クラウドヘルプ(ファイアウォールグループの新規作成)

③ Webサーバーの準備

Apache HTTP Serverアクセスログを可視化するため、ログ出力用のWebサーバーを用意します。
本検証ではlogclient01(ログ収集対象サーバー)にてApache HTTP Server 2.4.37(CentOS8)を起動し、テスト用のhtmlファイルを配置しています。

ここでは設定項目や設定値は省略させて頂きます。

④ ソフトウエアの準備

使用するソフトウエアのインストールとセットアップを行います。
事前に各ソフトウエアのRPMパッケージをinfluxdataのサイトから入手し、作業ディレクトリに配置してください。

以下はwgetコマンドでパッケージを入手する場合のコマンド例になります。

# wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.2.x86_64.rpm
# wget https://dl.influxdata.com/telegraf/releases/telegraf-1.15.3-1.x86_64.rpm
# wget https://dl.influxdata.com/chronograf/releases/chronograf-1.8.6.x86_64.rpm

今回の検証で使用したパッケージは以下の通りです。

ソフトウエア名 パッケージ
influxdb influxdb-1.8.2.x86_64.rpm
telegraf telegraf-1.15.3-1.x86_64.rpm
chronograf chronograf-1.8.6.x86_64.rpm

このほか、アクティビティログ取得のためlogserver01(ログ監視サーバ―)にニフクラCLI(8.0.1)(コマンドラインツール)をインストールしています。

influxdb(作業対象:logserver01)

influxdbはインストールと起動まで行います。

インストール
# yum -y localinstall influxdb-1.8.2.x86_64.rpm
起動
# systemctl start influxdb.service

telegraf(作業対象:logclient01/logserver01)

telegrafはインストールまで行います。

インストール
# yum -y localinstall telegraf-1.15.3-1.x86_64.rpm

chronograf (作業対象:logserver01)

chronografはインストールと初期セットアップまで行います。

インストール
# yum -y localinstall chronograf-1.8.6.x86_64.rpm
初期セットアップ

1.作業端末のWebブラウザーで以下のURLに接続します。
http://(logserver01のグローバルIP):8888/

2.[Get Started]をクリックします
f:id:TechnicalAccountEngineer:20201002155321p:plain

3.influxdbへの接続設定を行います。

今回は認証設定は行わないので、そのまま[Add Connection]をクリックします。
f:id:TechnicalAccountEngineer:20201002155344p:plain

4.ダッシュボード選択画面に遷移します。

今回はApache HTTP Serverのアクセスログを可視化するので、「Apache」を選択して[Create 1 Dashboard]をクリックします。
f:id:TechnicalAccountEngineer:20201002155415p:plain

5.Kapacitorへの接続設定画面に遷移します。

今回はKapacitorは使用しないので、[skip]をクリックします。
f:id:TechnicalAccountEngineer:20201002155444p:plain

6.セットアップ完了画面が表示されます。
[View All Connection]をクリックします。
f:id:TechnicalAccountEngineer:20201002155502p:plain

7.設定したinfluxdbが表示されていることを確認します。
f:id:TechnicalAccountEngineer:20201002160138p:plain

可視化してみる

セットアップが完了したので、続いてログを可視化をしていきます。

処理のイメージは以下の通りです。

f:id:TechnicalAccountEngineer:20201014152259p:plain
処理イメージ

① Apache HTTP Serverアクセスログ

まずはApache HTTP Serverアクセスログをtelegrafでinfluxdbに取り込み、chronografから確認します。

1.ログ形式の確認 (作業対象:logclient01)

httpd.confにて、設定されているログフォーマットを確認します。
今回はCombined Log Formatで検証します。

# cat /etc/httpd/conf/httpd.conf
~略~
<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
~略~
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    CustomLog "logs/access_log" combined  #combinedが有効になっていることを確認
</IfModule>
~略~

上記の設定で、アクセスログは以下のように出力されます。

192.168.50.20 - - [28/Sep/2020:16:48:38 +0900] "GET /aaaa HTTP/1.1" 404 202 "-" "curl/7.61.1"

2.telegraf設定 (作業対象:logclient01)

設定ファイル編集

Apache HTTP Serverアクセスログの読み込みにはinputs.tailプラグインを使用します。

デフォルトの設定ファイル(telegraf.conf)には使用可能なプラグインの設定が一通り記載されていますが、このままだと扱いづらいため、以下のコマンドを実施して必要最小限の設定が記載されたtelegraf.confを作成します。

# cd /etc/telegraf
# telegraf -sample-config --input-filter tail --output-filter influxdb > telegraf.conf

telegraf.confを編集します。

[outputs.influxdb]にて、出力先にlogserver01のinfluxdbを指定します。

[inputs.tail]はApache HTTP Serverアクセスログの形式に合わせて設定します。

# vi telegraf.conf
~略~
###############################################################################
#                            OUTPUT PLUGINS                                   #
###############################################################################


# Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]
  ## The full HTTP or UDP URL for your InfluxDB instance.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  # urls = ["unix:///var/run/influxdb.sock"]
  # urls = ["udp://127.0.0.1:8089"]
  # urls = ["http://127.0.0.1:8086"]
urls = ["http://192.168.50.20:8086"]  #「http://[logserverのIPアドレス]:8086」を指定
~略~
[[inputs.tail]]
  ## File names or a pattern to tail.
  ## These accept standard unix glob matching rules, but with the addition of
  ## ** as a "super asterisk". ie:
  ##   "/var/log/**.log"  -> recursively find all .log files in /var/log
  ##   "/var/log/*/*.log" -> find all .log files with a parent dir in /var/log
  ##   "/var/log/apache.log" -> just tail the apache log file
  ##
  ## See https://github.com/gobwas/glob for more examples
  ##
  #files = ["/var/mymetrics.out"]
files = ["/var/log/httpd/access_log"]    #アクセスログのパスを指定して追記する
~略~
  ## Data format to consume.
  ## Each data format has its own unique set of configuration options, read
  ## more about them here:
  ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
  #data_format = "influx"    #コメントアウトする
grok_patterns = ["%{COMBINED_LOG_FORMAT}"]    #以下の行を追記する。   
name_override = "apache_access_log"
grok_custom_pattern_files = []
grok_custom_patterns = '''
'''
grok_timezone = "Japan"
data_format = "grok"
outputs.influxdbパラメータ 設定値 備考
urls ["http://192.168.50.20:8086"] logserver01のinfluxdbを指定
inputs.tailパラメータ 設定値 備考
grok_patterns ["%{COMBINED_LOG_FORMAT}"] アクセスログのログフォーマットを指定
name_override "apache_access_log" chronografのダッシュボードに合わせて設定
grok_custom_pattern_files [] 設定なし
grok_custom_patterns '''(改行)''' 設定なし
grok_timezone "Japan" 日本のタイムゾーンを指定
data_format "grok" Grokパターンのフォーマットを指定
telegraf起動
# systemctl start telegraf.service

telegrafの設定が完了しました。

この状態でアクセスログが更新されると、telegrafによりinfluxdbへ取り込まれ、chronografから参照可能になります。

3.chronografから確認

初期セットアップ時に設定したApacheのダッシュボードからアクセスログを確認してみましょう。

左バーの[Dashboards]をクリックすると、初期設定時に選択したダッシュボードの一覧が表示されます。
[Apache]をクリックします。
f:id:TechnicalAccountEngineer:20201005103008p:plain

Apacheダッシュボードでは、アクセスログは「Response Codes(レスポンスコード集計グラフ)」と「Apache Logs(アクセスログの表示)」に反映されます。
「Apache Logs」にアクセスログが反映されています。
f:id:TechnicalAccountEngineer:20201005102905p:plain

「Response Codes」は初期状態では表示されないので、左上からテンプレート変数[:host:]を設定します。
f:id:TechnicalAccountEngineer:20201002163029p:plain

テンプレート変数[:host:]にlogclient01が反映されることで、「Response Codes」のグラフが表示されます。

画面例ではレスポンスコード200・405・500の時間ごとの件数がグラフ表示されています。 f:id:TechnicalAccountEngineer:20201005102716p:plain

また、[Explore]画面から手動でクエリーを発行することでも、ログの内容を表示することができます。

以下はダッシュボードと同様のレスポンスコード集計グラフを、手動でクエリーを発行することで表示しています。
f:id:TechnicalAccountEngineer:20201002163702p:plain

② ニフクラ アクティビティログ

Apache HTTP Serverアクセスログで設定した[Inputs.tail]の設定を応用することで、独自のログフォーマットであるアクティビティログもchronografで可視化することが可能です。

1.アクティビティログ収集スクリプト作成 (作業対象:logserver01)

ニフクラCLIでアクティビティログを取得し、ファイルに出力するスクリプトを作成します。 スクリプトの作成については前回の記事「OSSのfluentdでニフクラの各種ログを収集して解析してみる」でご紹介していますので、そちらをご参照ください。

2.telegraf設定 (作業対象:logserver01)

設定ファイル編集

設定ファイルの作成と[outputs.influxdb]の設定は、Apache HTTP Serverアクセスログの場合と同様に行うため、ここでは省略します。

[inputs.tail]の設定は、アクティビティログのフォーマットに合わせて設定します。influxdb上で各レコードに割り当てるタグ名・フィールド名もここで指定します。

#アクティビティログ出力例
2020-09-28T14:18:59+09:00 xxx.xxx.xxx.xxx API(利用状況) account1 DescribeUserActivities[] true
2020-09-28T09:54:59+09:00 yyy.yyy.yyy.yyy サーバー account1 起動[サーバー:logclient01,BIOS画面停止:false] true
2020-09-28T09:54:55+09:00 zzz.zzz.zzz.zzz サーバー account1 起動[サーバー:logserver01,BIOS画面停止:false] true
2020-09-28T09:52:58+09:00 aaa.aaa.aaa.aaa サービス account2 ログイン true
# vi telegraf.conf
~略~
[[inputs.tail]]
  ## File names or a pattern to tail.
  ## These accept standard unix glob matching rules, but with the addition of
  ## ** as a "super asterisk". ie:
  ##   "/var/log/**.log"  -> recursively find all .log files in /var/log
  ##   "/var/log/*/*.log" -> find all .log files with a parent dir in /var/log
  ##   "/var/log/apache.log" -> just tail the apache log file
  ##
  ## See https://github.com/gobwas/glob for more examples
  ##
  #files = ["/var/mymetrics.out"]
files = ["/var/log/httpd/access_log"]    #アクセスログのパスを指定して追記する
~略~
  ## Data format to consume.
  ## Each data format has its own unique set of configuration options, read
  ## more about them here:
  ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
  #data_format = "influx"    #コメントアウトする
grok_patterns = ["%{TIMESTAMP_ISO8601:timestamp:tag} %{IPV4:IPADDR} %{NOTSPACE:service} %{NOTSPACE:nifid} %{NOTSPACE:message} %{NOTSPACE:auth}"]    #以下の行を追記する。   
name_override = "activity_log"
grok_custom_pattern_files = []
grok_custom_patterns = '''
'''
grok_timezone = "Japan"
data_format = "grok"
inputs.tailパラメータ 設定値 備考
grok_patterns ["%{TIMESTAMP_ISO8601:timestamp:tag} %{IPV4:IPADDR} %{NOTSPACE:service} %{NOTSPACE:nifid} %{NOTSPACE:message} %{NOTSPACE:auth}"] アクティビティログのフォーマットに合わせてGrokパターンを指定
name_override "activity_log" 任意設定
grok_custom_pattern_files [] 設定なし
grok_custom_patterns '''(改行)''' 設定なし
grok_timezone "Japan" 日本のタイムゾーンを指定
data_format "grok" Grokパターンのフォーマットを指定
telegraf起動
# systemctl start telegraf.service

アクティビティログ用のtelegrafの設定が完了しました。

アクティビティログ取得スクリプト実行時に、ファイルに新しく出力されたログがinfluxdbに転送され、chronografから参照可能になります。

3.chronografから確認

アクティビティログは[Explore]画面から表示します。 [Explore]画面にて以下のクエリーを入力し[Submit Query]を押下します。
画面上でDB・テーブル・フィールドを選択してクエリーを組み立てることも可能です。

SELECT "IPADDR", "auth", "service", "message", "nifid" FROM "telegraf"."autogen"."activity_log" WHERE time > :dashboardTime: AND time < :upperDashboardTime: GROUP BY "timestamp"

f:id:TechnicalAccountEngineer:20201005103532p:plain

画面上半分に表示ができない旨が表示されるので、[Switch To Table Graph]をクリックします。

アクティビティログが表示されます。 f:id:TechnicalAccountEngineer:20201002165252p:plain

アクティビティログは 仕様上、ログ取得時刻とログ内のタイムスタンプが一致しないため、chronografでのグラフ表示には向きませんが、chronografから参照することでタイムスタンプやIPアドレスでソートできるようになるため、ログが格段に見やすくなると思います。

まとめ

telegraf・influxdb・chronografを使って、ログの可視化を検証しました。フォーマットの指定方法やクエリーの組み立てなど、初見では難しい箇所もありましたが、全体の手順としては比較的容易だったと思います。

ニフクラアクティビティログに限らず、独自フォーマットのログでもtelegrafの[inputs.tail]の設定を適切に実施することで、chronografで可視化できると思われます。

また、本検証では扱っていませんが、シスログについてはchronografに専用のログビューアが用意されており、さらに手軽に可視化できます。

ログに対する分析や解析を行う場合は、複雑なクエリーを用意する必要があるので難易度が高くなりますが、導入から可視化までの手軽さは魅力だと感じました。

ここまで読んでいただきありがとうございました!

注意事項

  • 本記事については検証結果の1つとなります。実際に検討される場合は、事前にそれぞれの要件を鑑みて実装するか確認してください。
  • 本記事ではOS上の操作についても記載していますが、ニフクラではOS以上はご利用者様の責任範囲となりますのでご留意ください。
  • 本記事で記載した各サービス/ニフクラの機能等は、2020年9月時点の情報です。利用時には各サービス/ニフクラの機能の最新情報をご確認いただきご利用ください。