こんにちは、マネージドサービス部の大城です。久しぶりにブログを書きます。 WindowsイベントログをNew Relic Logsで収集する方法は、New Relic Infrastructure Agentを使用する方法と、Fluentdを利用する方法の2つが考えられます。どちらの方法にもそれぞれメリットとデメリットがあります。 結論だけ知りたい方は下に比較表を記載しているのでそちらを参照してください。
Windowsイベントログ収集の難しさ
はじめにWindowsイベントログを収集することの難しさについて記載します。 イベントログはデフォルトだと %SystemRoot%\System32\winevt\Logs フォルダーにバイナリで保管されています。 PowerShell でテキスト出力させることは出来ますが Windows-31J というMicrosoft独自の文字コードとなっておりNew Relic Logsに送信する際に UTF-8 に変換する必要があります。 また、イベントログ自体はチャンネル、イベントソース、イベントIDなどで構造化されています。これらの情報を正しく抽出し解析するため、収集したログを適切にパースしてフィールドを分けることが望ましいです。 以上のことから、テキストファイルのように単純な方法では収集することが難しいです。
New Relic Infrastructure Agent
New Relic Infrastructure Agent で収集するのが一番簡単です。New Relicさんのブログでも紹介されていました。
Infrastructure AgentでWindowsイベントログをNew Relic Logsに送信する
公式ドキュメントはこちら ちなみにドキュメントを読むと内部的に Fluent-bit を利用していることが分かります。
インストール方法
「ガイド付きインストール」で New Relic Infrastructure Agent を Windows にインストールするとデフォルトでイベントログがNew Relic Logsに収集されます。
Windows向けInfrastructureモニタリングエージェントをインストールする | New Relic Documentation
から「ガイド付きインストール」をクリック
- アカウントを選択
- Windowsを選択
- Begin installation をクリック
コマンドが表示されるのでコピーして PowerShell を管理権限で起動し実行します。しばらくするとNew Relic Logsにイベントログが連携されます。
フィルター方法
New Relic Infrastructure Agentを利用する場合、イベントIDを指定したり除外したりすることで、収集するログをエージェント側でフィルターすることができます。これにより、必要なイベントIDのみを選択してNew Relic Logsに転送することが可能です。
C:\Program Files\New Relic\newrelic-infra\logging.d\logs.yml を編集します。 例えば「applicationチャンネルで、イベントID:4106 だけ収集したい」場合は下のような設定になります
logs: - name: windows-application winevtlog: channel: Application collect-eventids: - 4106 attributes: logtype: windows_application
収集されるログ
ログのフィールドをみて分かる通り、New Relicが自動的に取得するフィールドが付与されて収集されます。
{ "ActivityID": "", "agentName": "Infrastructure", "agentVersion": "1.47.0", "awsAccountId": "xxxxxxxxxxxx", "awsAvailabilityZone": "ap-northeast-1c", "awsRegion": "ap-northeast-1", "Channel": "Application", "Computer": "xxxxxxxxxxxxxx", "coreCount": "2", "ec2AmiId": "ami-xxxxxxxxxxxxxx", "entity.guid.INFRA": "xxxxxxxxxxxxxxxxxxxxx", "entity.guids": "xxxxxxxxxxxxxxxxxxxxx", "EventID": 4625, "EventRecordID": 15622, "fb.input": "winevtlog", "fullHostname": "xxxxxxxxxxxxxx.ap-northeast-1.compute.internal", "hostname": "xxxxxxxxxxxxxx", "hostStatus": "running", "instanceType": "t3.medium", "Keywords": "0x80000000000000", "Level": 4, "logtype": "windows_application", "message": "EventSystem サブ システムは、86400 秒の間、重複したイベント ログのエントリを抑制しています。抑制のタイムアウトは次のレジストリ キーの下の SuppressDuplicateDuration という名前の REG_DWORD の値によって制御可能です: HKLM\\Software\\Microsoft\\EventSystem\\EventLog", "newrelic.logPattern": "nr.DID_NOT_MATCH", "newrelic.source": "api.logs", "nr_deployed_by": "newrelic-cli", "Opcode": 0, "operatingSystem": "windows", "plugin.source": "BARE-METAL", "plugin.type": "nri-agent", "plugin.version": "1.17.1", "ProcessID": 0, "processorCount": "1", "ProviderGuid": "{899DAACE-4868-4295-AFCD-9EB8FB497561}", "ProviderName": "Microsoft-Windows-EventSystem", "Qualifiers": 16384, "RelatedActivityID": "", "StringInserts": "[\"86400\",\"SuppressDuplicateDuration\",\"Software\\\\Microsoft\\\\EventSystem\\\\EventLog\"]", "systemMemoryBytes": "4231557120", "Task": 0, "ThreadID": 0, "TimeCreated": "2023-08-31 10:37:12 +0000", "timestamp": 1693478260402, "UserID": "", "Version": 0, "windowsFamily": "Server", "windowsPlatform": "Microsoft Windows Server 2019 Datacenter", "windowsVersion": "10.0.17763 Build 17763" }
メリット
New Relic Infrastructure Agentに同封されているため、設定が手軽に行えます。 New Relic が自動的に付与するフィールド(例: ホスト名など)が、手動で設定する必要なく、ログに付加されます。
デメリット
イベントID以外の条件でエージェント側でのフィルタリングは行えません。 イベントID以外の条件で監視設定する際には、抽出条件を指定するためにNRQLを記述する必要があります。
Fluentd
Fluentd + New Relic の Plugin を利用して New Relic Logs に収集する方法もあります。 公式ドキュメントはこちら
インストール方法
https://td-agent-package-browser.herokuapp.com/
からWindowsのパッケージを確認します。今回は4.5.1を使いました。ダウンロードしインストールします
Invoke-WebRequest -Uri https://s3.amazonaws.com/packages.treasuredata.com/4/windows/td-agent-4.5.1-x64.msi -OutFile td-agent-4.5.1-x64.msi # ダウンロードした td-agent-4.5.1-x64.msi をすべてデフォルト
New Relic の Plugin をインストールします
cd C:\opt\td-agent\bin .\fluent-gem install fluent-plugin-newrelic
confを準備します。Applicationチャンネルをすべて転送する最低限の設定です。
- C:\opt\td-agent\etc\td-agent\td-agent.conf
<source> @type windows_eventlog2 channels application read_existing_events false read_interval 30 tag winevt.application <storage> @type local persistent true path ./tmp/winevt.application.json </storage> </source> # Forward all events to New Relic <match winevt.**> @type newrelic license_key XXXXXXXXXXXXXXXXXXXXX </match>
Fluentd を起動します。
net start fluentdwinsvc
フィルター方法
Fluentdを使用する場合は、特定のフィールドを grep で指定して複数の条件をフィルタリングすることができます 例えば「applicationチャンネルで、Error のみを連携したい。ただしイベントID:4106 は除外したい。」場合は下のような設定になります
<source> @type windows_eventlog2 channels application read_existing_events false read_interval 30 tag winevt.application <storage> @type local persistent true path ./tmp/winevt.application.json </storage> </source> <filter winevt.application> @type grep <regexp> # Level: 2 = Error key Level pattern /^2$/ </regexp> <exclude> key EventID pattern /^4106$/ </exclude> </filter> # Forward all events to New Relic <match winevt.**> @type newrelic license_key XXXXXXXXXXXXXXXXXXXXX </match>
収集されるログ
New Relic Infrastructure Agentに比べてフィールドが少ないです。
{ "ActivityID": "", "Channel": "Application", "Computer": "XXXXXXX", "Description": "<サーバーワークス監視テスト> にある自動更新 cab ファイルからサード パーティのルート一覧を抽出できませんでした。エラー: %2。", "EventData": "[\"サーバーワークス監視テスト\"]", "EventID": "4107", "EventRecordID": "15589", "hostname": "XXXXXXX", "Keywords": "0x80000000000000", "Level": "2", "log_name": "winevt.application", "newrelic.source": "api.logs", "Opcode": "0", "plugin.type": "fluentd", "plugin.version": "1.2.2", "ProcessID": "0", "ProviderGUID": "", "ProviderName": "Microsoft-Windows-CAPI2", "RelatedActivityID": "", "Task": "1", "ThreadID": "0", "TimeCreated": "2023/05/19 06:40:13.806943500", "timestamp": 1684478434834, "UserID": "", "Version": "0" }
メリット
Fluentdでは提供されている grep を使用することで、エージェント側で複雑な条件を指定してデータをフィルタリングすることが可能です。この機能を活用することで、New Relicへ送信するデータ量を効果的に節約することができます。
デメリット
追加でFluentdをインストールする必要があります。本番環境で稼働させる場合、Fluentd自体の監視と運用についても考慮する必要が出てきます。
比較表
どちらが優れているということは無く、要件に合わせて利用するツールを選択いただくほうがよいと思います。
方法 | メリット | デメリット |
---|---|---|
New Relic Infrastructure Agent | シンプルなセットアップと設定 New Relicが自動的に取得するフィールドが付与される |
エージェント側のフィルターはイベントIDのみ |
Fluentdを利用する方法 | 複雑なフィルターがエージェント側で可能 New Relicへ送信するデータ量を節約できる |
エージェント側で追加のリソース消費が発生する Fluentdの運用を考える必要がある |
最後に
ここまで読んでいただきありがとうございます。この記事が誰かの役に立ったら幸いです。
大城 慶明 (記事一覧)
マネージドサービス部
2022年10月サーバーワークスに入社、沖縄からリモート勤務。AWSを勉強中。沖縄では大城が多いので「よっさん」と呼ばれています。AWS13冠。NRUG沖縄支部運営。X @yo_ohshiro