システムのレジリエンスを強化

Windows Server のシステムロケールを Shift_JIS にしている場合、New Relic にログを取り込むと日本語メッセージが読み取りにくい場合があります。

回避方法の1つが OSのシステムロケール設定を UTF-8 に変更する方法となりますが、運用中のサーバーに対するシステムロケール変更は難しいケースがあります。

ここでは Windows イベントログ(Shift_JIS)を New Relic に取り込んでいる環境に対して fluentd およびプラグインを導入することで視認性を向上させる方法について、ご紹介したいと思います。

なお、Windows イベントログではなく、Windows 上にある一般的なログファイル(Shift_JIS)の連携方法につきましては、こちらのBlog をご参照ください。

(本 Blog は、上記リンク先にある Blog のイベントログ特化版としてご利用ください)

イベントログ対応 fluentd 連携手順

それでは早速、fluentd によるイベントログ連携手順を紹介します。なお下記手順は Windows に New Relic Infrastructure agent のインストールが完了している前提となります。インストール未実施の場合は、こちらのドキュメントなどを参考に導入を進めてください。

  1. Fluentd のダウンロードページから、環境に合ったバイナリーをダウンロードし、インストールします。
    (ここでは fluent-package をインストールする前提で以降の手順を記載しますが、td-agent をインストールしても問題ありません)
  2. 1. で fluent-package をインストールした場合、”Fluent Package Command Prompt” がインストールされますので、プログラム一覧の中からこのアプリを起動します。コマンドプロンプトが起動しますので、以下のコマンドを実行します。
      > fluent-gem.bat install fluent-plugin-newrelic
  3. 続けて、イベントログ収集用の fluentd プラグインをインストールします。
      > fluent-gem.bat install fluent-plugin-windows-eventlog
  4. こちらのドキュメントを参考に、Fluentd プラグインの設定をおこないます。
    設定ファイルは C:¥opt¥fluent¥etc¥fluent¥fluentd.conf になります。
    ドキュメントの記載内容が良く分からない場合は、以下のサンプルを fluentd.conf ファイルの一番下に追記してみてください。(動作の確認後、適宜修正してください)

    なお、サンプルの49行目にあるライセンスキーは、Infrastructure agent で利用しているライセンスキーを利用いただければ問題ありません。Infrastructure agent の設定ファイルは C:¥Program Files¥New Relic¥newrelic-infra¥newrelic-infra.yml にあります。
##############################################################################

#Windows Eventlog Test2
<source>
  @type windows_eventlog2
  @id windows_eventlog2
  ##channels application,system,security,setup
  read_all_channels true
  tag winevt2.raw
  <storage>
    @type local
    persistent true
    path c:\opt\fluent\winevt2.pos
  </storage>
</source>


#Tail one or more log files
<source>
  @type tail
  <parse>
    @type none
  </parse>
  path c:\opt\fluent\hoge.txt
  tag example.service
</source>

#Add hostname and service_name to all events with "example.service" tag
<filter example.service>
  @type record_transformer
  <record>
    service_name ${tag}
    hostname "#{Socket.gethostname}"
  </record>
</filter>

<filter winevt2.raw>
  @type record_transformer
  <record>
    message ${record["Description"]}
    hostname "#{Socket.gethostname}"
    logtype ${tag}
  </record>
</filter>

#Forward all events to New Relic
<match **>
  @type newrelic
  license_key <ここにライセンスキーを記載>
</match>

 設定後、fluentd を再起動します。
再起動は Windows サービスから実行すると便利ですが、fluentd サービスの実行ユーザーをadministrator 権限のあるユーザーで実行することで、イベントログ内の Security チャンネルログも取得できるようになりますので、このタイミングで変更します。

スクリーンショットの例では、administrator ユーザーで実行しています。
またサービスは手動起動となっていますが、OS 再起動後も自動的にサービスを起動させたい場合は自動設定にすると便利です。

fluentd-service

この状態で New Relic UI からログを参照し、日本語のイベントログメッセージが参照できている事を確認してください。

ただし、今のままでは読み取りが厳しいイベントログメッセージも並行して取り込んでいる状態になります。そこで Infrastructure agent (fluent-bit) からイベントログを転送しないように設定変更します。

C:¥Program Files¥New Relic¥newrelic-infra¥logging.d に移動し、logs.yml 内のイベントログ設定箇所をコメントアウトします。

なお、設定変更後の newrelic-infra サービスの再起動は不要です。

logs:
#  - name: windows-security
#   winevtlog:
#      channel: Security
#      collect-eventids:
#      - 4740
#      - 4728
#      - 4732
#      - 4756
#      - 4735
#      - 4624
#      - 4625
#      - 4648
#    attributes:
#      logtype: windows_security

#  - name: windows-application
#    winevtlog:
#      channel: Application
#    attributes:
#      logtype: windows_application

  - name: newrelic-cli.log
    file: C:¥Users¥Administrator¥.newrelic¥newrelic-cli.log
    attributes:
      newrelic-cli: true
      logtype: newrelic-cli

何か日本語のイベントログが出力されるのを待っても良いですが、意図的にログを出力しテストしたい場合は、Windows PowerShell などから以下のようにコマンドを実行します。(必要に応じて適宜修正ください)

eventcreate.exe /L Application /T ERROR /SO "CreateEvent Test" /ID 999 /D "テスト1"

トラブルシューティング

記載の通り設定してみたものの、テストログが New Relic 上で確認できない場合は、以下のポイントをチェックしてみてください。

  1.  ファイアーウォール設定に問題がないか:

     fluentd プラグインは、New Relic のログAPI を利用してデータを転送します。
     下記エンドポイントとの疎通に問題がないか、確認してみましょう。

      データセンターが US の場合:log-api.newrelic.com
      データセンターが EU の場合:log-api.eu.newrelic.com
     
  2.  proxy 設定は実施済か :

     New Relic のログAPIエンドポイントとの通信において proxy サーバーを経由する場合は、proxy を利用するための設定が必要になります。

     設定は、Windows OS の環境変数を用います。

      変数名:http_proxy
      値  :proxy サーバーの IPアドレス:ポート番号(例:192.168.0.xxx:8080)

     参考までに、レジストリを変更することにより サービス単位で環境変数を設定することも可能なようです。詳しくは OS 側のサポートなどでご確認ください。
     
  3.  fluentd のログを見てみる:

     fluentd のログは、Windows 環境では C:¥opt¥fluent¥fluentd-数字.log あたりに出力されています。fluentd サービスの起動時や、テストログを書き込んだタイミングなどに気になるメッセージが出力されていないか確認してみましょう。

     ログレベルは変更しなくてもある程度参考になると思いますが、ログレベルを trace などに設定した場合、大量のログが出力されてしまい高負荷状態になる可能性がありますので、ご注意ください。

いかがでしたでしょうか。

New Relic Infrastructure agent と合わせて fluentd およびプラグインを利用することで、Shift_JIS のイベントログも視認性よく収集・検索することができるようになりました。ぜひお試しください。