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

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 ユーザーで実行しています)

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 Infrastructure agent に fluentd およびプラグインを連携させることで、Shift_JIS のイベントログも視認性よく収集・検索することができるようになりました。ぜひお試しください。