LogDNAでCloudFoundryアプリケーションのログを監視する

#はじめに
IBM Cloud上で動くNode.jsアプリのログをLogDNAで監視できるように設定しました。
Kubernetes(k8s)の場合とCloudFoundry(CF)の場合とでは設定方法が異なりますが、k8sを前提に書かれている記事が多かったので、CFの場合の設定方法をまとめてみます。

LogDNAの概要やk8sでの設定方法、IBM Log Analysis with LogDNA インスタンスの作成手順は他の記事を参考にしてください。

- https://qiita.com/asasaki/items/c8aee30ee7151740d624#logdna%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A
- https://qiita.com/daihiraoka/items/eafce5988589e3051c70

# 前提

- ログ監視対象のアプリがIBM Cloud上で動いている
- IBM Log Analysis with LogDNA インスタンスが作成済み
- ibmcloudコマンドをインストール済み

# platform services logsの設定

IBM Cloud のDashboardから、ResourceList > Services > IBM Cloud Log Analysis with LogDNA インスタンスを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/50c3c363-e52c-ab46-d275-dc9b63145b52.png)

Logging タブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/c912aa97-9fe7-80d3-9f02-4ba09e3269b8.png)


最初の段階ではSourcesの項目にリージョン名しか書かれていないと思うので、platform services logs を設定します。

画面右上の「Cofigure platform services logs」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/1a74651e-31f6-1fef-bfa1-3c8b9d6e8064.png)

モーダル画面が開くので、ログ監視をしたいアプリのあるリージョンと IBM Log Analysis with LogDNA インスタンスを選択し、「Save」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/609017a9-e542-3d51-88c7-18e3828596f2.png)

「View LogDNA」ボタンをクリックしてLogDNAコンソールを開き、ログが転送されていることを確認します。

# CUPS (Custom user provided service) の設定

IBM Cloudの公式ドキュメントによると、上記のplatform services logsの設定だけで、該当リージョンのアプリ/サービスのログをLogDNAに転送する設定が完了のようですが、私の環境ではうまくいきませんでした。
調べてみると、**Node.js, Ruby, fluentd等の一部のサービスでは、LogDNAにログを転送するのに追加設定が必要になるそうです。**この情報は公式ドキュメントには記載がなく、また、どのような追加設定が必要かという情報も見つけられませんでした。

そこで、もう一つの方法であるCUPSを設定してみます。

1. LogDNAのポートを用意する
    - 「View LogDNA」ボタンをクリックして、LogDNA インスタンスを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/18fbe227-e555-4b3d-8c19-087f2aa527c1.png)
    - 画面左のタブから「Install Instructions」アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/5bc6e50f-9ab6-c6b7-2528-47e98527bcf9.png)
    - モーダル画面が現れるので、左端の View Syslog > Syslog >「Provision a Syslog port」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/318bd49d-309f-b4aa-a8b8-ae8040a1dfa7.png)
    - ポートが表示されるので、コピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/d68210dd-26f9-bebe-5c7d-1ba01a726b9f.png)
2. CUPSを作成する
    - ターミナルからibmcloudにログインします。
    - 以下のコマンドを実行します。  
    `ibmcloud cf cups SVC_INSTANCE_NAME -l syslog://SYSLOG_ENDPOINT_URL:PORT_NUMBER`  
SVC_INSTANCE_NAMEは作成するCUPSのインスタンス名です。  
SYSLOG_ENDPOINT_URL:PORT_NUMBERは1の手順でコピーしたものです。

3. CUPSとログ監視対象のアプリを紐付ける
    - 以下のコマンドを実行します。  
    `ibmcloud cf bind-service CF_APP_NAME SVC_INSTANCE_NAME`  
CF_APP_NAMEはログ監視対象のアプリ名です。  
SVC_INSTANCE_NAMEは前の手順で作成したCUPSインスタンス名です。  

4. ログ監視対象アプリをリステージする
    - 以下のコマンドを実行します。  
    `ibmcloud cf restage CF_APP_NAME`  
CF_APP_NAMEはログ監視対象のアプリ名です。  

「View LogDNA」ボタンをクリックしてLogDNAコンソールを開き、ログが転送されていることを確認します。
Liteプランの場合は、ログを保持することができないので、画面右下の「LIVE」ボタンをオンにしてアプリを動かして、ログが出力されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122591/6ed39190-b6d2-1799-cc6f-a0abea81e4f3.png)

# 参考リンク
CFアプリのログ監視についての公式ガイドです。
https://cloud.ibm.com/docs/services/Log-Analysis-with-LogDNA?topic=LogDNA-monitor_cfapp_logs