Stackdriver LoggingにGCEのWindows VM上の任意のログを連携する

# はじめに
GCPにはStackdriver Loggingというログの収集・管理・可視化のためのフルマネージドサービスが存在します。

GCP上の各サービスは、GCPコンソール上でStackdriver Loggingサービスとの連携をするよう設定することが可能で、この設定をONにすることにより、特にOS上で設定やコードの記述なく、さまざまなログをStackdriver Loggingサービスにストリーミングで連携するようになります。（例えば、GCEをGCPコンソールで操作した際のアクティビティ・ログ、GKE上の各コンテナ上の標準出力、など）

簡単に使えて、検索・可視化の機能まで利用できるので便利だな、と感じていたものの、どうせフルマネージドサービスなので、カスタマイズして使うのは大変なんだろうな、と思っていました。

しかし、Stackdriver Loggingのドキュメントを読んでみると興味深いことが書かれていました。

- このサービスは実はfluentdで実装されている
- GCPコンソール上で連携するよう設定することで、内部的にStackdriver Logging Agent（fluentd Agent）がインストールされてログ連携される仕組みになっている
- Stackdriver Logging Agentの構成ファイル（fluentd互換の形式で書かれている）がOS上にあり、この構成ファイルに設定を追加することで、事前定義の設定でカバーできない任意のログをStackdriver Loggingサービスに連携できる（下図の赤枠部分）

引用：https://cloud.google.com/logging/docs/agent/?hl=ja
![image.png](https://qiita-image-store.s3.amazonaws.com/0/233097/541b7a6f-8c36-ab4f-418d-72313ed650ba.png)

つまり、マネージドサービスでありながらも、カスタマイズして使うことが可能だ、ということです。
この記述を検証するために、今回はGCEで作成したWindowsインスタンスのOS上の任意のログファイルについて、Stackdriver Loggingに連携するように設定し、実際に連携されることを確認してみます。

#### ＜注意事項＞
- 本稿は、GCPのサービスを利用する手順を記載しており、手順を実施することでGCPの利用料が発生します。そのため記載内容を理解の上、自己責任で手順を実施するようにしてください。
- 本稿は2019年1月時点の情報に基づいており、現在の情報と異なっている可能性があります。
-本稿の内容は執筆者独自の見解であり、所属企業における立場、戦略、意見を代表するものではありません。


# 検証作業の実施
## 作業前提
- GCPに接続可能なGoogleアカウントを持ち、GCP上のプロジェクトでGCE上にWindowsインスタンスが作成されていることとします。
- Stackdriver LoggingのAPIをオンになっているものとします。

## 作業の流れ
- GCE上のWindowsインスタンスからStackdriver Loggingサービスに書き込みができるように、権限を付与します。
- Stackdriver Logging Agentを対象のWindowsサーバーにインストールします。
- Windows上でテスト用にログを定期的に出力するスクリプトを作成し、実行しておきます。
- Windows上の任意のログの内容をStackdriver Logging上に連携するように、Stackdriver Logging Agent（実体はfluentd）の構成ファイルを設定変更し、反映します。
- 指定のログが実際に連携され、Stackdriver Logging GUI上で表示されることを確認します。

## 実施手順
### 1. GCPコンソール上での作業（その１）
#### 対象のWindowsインスタンスへの権限付与
- 下記の記事を参考に、対象のWindowsインスタンスへの権限付与を行います。
  - 参考：エージェントの承認
    - https://cloud.google.com/logging/docs/agent/authorization?hl=ja

### 2. Windowsインスタンス上での作業
#### Stackdriver Loggingエージェントのインストール
- Windowsインスタンスにログオンし、下記の記事を参考にエージェントをインストールします。
  - 参考：エージェントのインストール 
    - https://cloud.google.com/logging/docs/agent/installation?hl=ja

#### 定期的にログ出力を行うテスト用スクリプトの作成＆実行
- Windows上で、Explorer等から出力対象の空のログファイル（例：`C:\Work\testlog.log`）を生成しておきます。
- 定期的にログ出力を行うPowerShellスクリプトを作成します（下記は例）

```powershell:output-test.ps1
while(1) {
  $Now = Get-Date
  $Log = "test message - " + $Now.ToString("yyyy/MM/dd HH:mm:ss.fff")
  $LogFile = "C:\Work\testlog.log"

  Write-Output $Log | Out-File -FilePath $LogFile -Encoding Default -append
  Write-Output $Log
  Start-Sleep -Seconds 60
}
</source>
```

- このスクリプトを実行します。

#### Stackdriver Loggingエージェントの構成 
- 下記の記事を参考に、構成ファイルを編集していきます
  - 参考：ログファイルを使用して非構造化（テキスト）ログをストリーミングする
    - https://cloud.google.com/logging/docs/agent/configuration?hl=ja
- 今回の例では、in_tailプラグインを使って、テキストデータの記載内容をパースしたりせずに、そのまま行単位で連携していくこととします。
  - 設定例：
    - 設定ファイルは次のパスに作成：`C:\Program Files (x86)\Stackdriver\LoggingAgent\conf.d\testlog.conf`
    - `@type tail`を指定
    - `format none`を指定
    - `path`には先ほど作成したスクリプトの出力先を指定
    - `pos_file`には.posファイルのパス（任意）を指定
    - `tag`には任意のタグを指定（例として`unstructured-log`を指定。後でStackdriver Logging GUIで利用します）

```config:testlog.conf
<source>
    @type tail
    # Format 'none' indicates the log is unstructured (text).
    format none
    # The path of the log file.
    path 'C:\Work\testlog.log'
    # The path of the position file that records where in the log file
    # we have processed already. This is useful when the agent
    # restarts.
    pos_file 'C:\Program Files (x86)\Stackdriver\LoggingAgent\Maain\pos\testlog.pos'
    read_from_head true
    # The log tag for this log input.
    tag unstructured-log
</source>
```

- 設定を反映するため、fluentdを再起動します。
  - 参考：エージェントを再起動する
    - https://cloud.google.com/logging/docs/agent/installation?hl=ja

### 3. GCPコンソール上での作業（その２）
#### Stackdriver Logging GUIへのアクセス
- GCPにログインし、該当のプロジェクトを選択して、Stackdriver Logging GUIを開きます。

#### ログ出力の確認
- 該当のインスタンスを選択し、真ん中のログ種別を選択するプルダウンメニューでタグが選択できるので（赤枠部分）、Stackdriver Agentで指定したタグ（例では`unstructured-log`）を指定します。するとWindowsインスタンス上で連携するように指定したログが表示されているはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/233097/697dd936-4336-9a8c-8ac8-4ca8af7496d0.png)


# まとめ
今回はStackdriver Logging AgentをGCEのWindowsインスタンスに導入することで、OS上の任意のログが連携できることを確認しました。

Stackdriver Loggingサービスでは、ログの収集・蓄積だけでなく、検索・可視化もできるようになるので、例えばfluentd+ElasticSearch+Kibanaなどで実装するログ管理基盤などを持っていなくても、気軽にそうした機能を使うことができるようになるというのが利点かなと思います。

マネージドサービスではありながらも、fluentdというログ収集で最もポピュラーなOSSの仕様に基づき、カスタマイズもできる、というのも非常に有用だと思いますので、ぜひ使い倒していたきたいなと思います。