JUCEでのログ出力関係整理

# VST/AUでのログ出力準備
ビルドと同時にAudio Plugin Hostを起動することでログを確認する。
ダブルクリックで追加可能なプラグイン一覧が表示されるので確認したいプラグインを選択して追加する。
Editor関係は追加されたプラグインをダブルクリックしてUIが表示されたタイミングからログが確認できる。
一覧に無い場合は`⌘(ctrl)+P > 左下Options... > scan for new or update ○◯ plug-ins`を実行すると一覧に表示されるようになる
## Xcode(mac)
`Edit Scheme > Run > Execute`で`Audio Plugin Host`を選択 
![Screen Shot 2021-09-27 at 15.43.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136558/58b0867b-5b86-8a64-f8f3-52a53138b4ba.png)
![Screen Shot 2021-09-27 at 15.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136558/504af9a9-636a-4d67-31fb-2d9b04e9748f.png)

## Visual Studio(windows)
以下はVisualStudio上でログを確認するための手順ですが作業量が多いので後述のFileLoggerを使用するのが無難かもしれません。

### 管理者権限でVisual Studioを起動させる
デスクトップ等にショートカットを作成し、`右クリック > 管理者として実行`　で管理者権限で起動できる。
projucerから出力した際に対応できるように常に管理者権限で開くには以下のリンクのように
VisualStudioのファイルの場所に移動し、
`devenv.exe`を`右クリック > 互換性のトラブルシューティング > 問題のトラブルシューティング > 「プログラムにアクセスするには追加のアクセス許可が必要になる」`にチェックすることで可能になる。

https://www.wareko.jp/blog/always-run-visual-studio-with-administrator-privileges

### AudioPluginHostをビルド後に自動で起動させる
~~ソリューションエクスプローラーにて「プロジェクト名_VST3」を選択して右クリック > スタートアッププロジェクトに設定~~

~~ソリューションエクスプローラで「プロジェクト名_VST3」を右クリック>プロパティ等でプロパティページ を開き
・左上の構成で「すべての構成」を選択
・構成プロパティ/デバッグ > コマンドにAudioPluginHost.exeのパスを指定~~

ProjucerでVisual Studio20xxのDebug/Releaseを選択、
`Post-build Command`に`start AudioPluginHost.exeのフルパス`と記述

ただし、この方法だとVST以外(SharedCode等)のビルド時にもAudioPluginHostが起動してしまうので
`起動させたくないプロジェクト(SharedCode等)のプロパティ > ビルドイベント > ビルド後のイベント > コマンドライン` を何も記述されていない状態にしておく

### プラグインをVST3ディレクトリにコピー
VST3のデフォルトパスである`C:¥Program Files¥Common Files¥VST3`にビルド後に自動で追加されるようにする。

~~プロパティ > 構成プロパティ/ビルドイベント > ビルド後のイベント にて
コマンドラインに`xcopy "$(TargetPath)" "$(CommonProgramW6432)¥VST3¥" /Y`と記述~~


`C:¥Program Files¥Common Files¥VST3`フォルダがなければ作成しておく。
ProjucerでVisual Studio20xxのDebug/Releaseを選択、
・`EnablePluginCopyStep`を`Enable`に指定 
・`VST3BinaryLocation`に`$(CommonProgramW6432)\VST3`と記述

### プロセスのアタッチ
ビルド & AudioPluginHostの起動後、`デバッグ > プロセスにアタッチ > 使用可能なプロセス`からAudioPluginHostを選択しアタッチすることでログが確認できるようになる。

※毎回この作業をするのが面倒なので自動的にアタッチする方法をご存知の方はご指摘いただけると助かります。。

# ログ出力
## DBG()
シンプルなログ出力

```c++
    int hoge = 1;
    DBG("hoge: " << hoge); // hoge: 1
```

## FileLogger
FileLoggerを使用してログをテキストファイルに出力することができる。

~~FileLoggerはDBGの実体に使われているLoggerの継承クラスであり、個別にインスタンスを作るよりDBGの出力先を変更する使い方が良さそう。~~
  ->windowsのDBG()はLoggerが使われていないためLogger::getCurrentLogger()->WriteToLog()を使うようにしてファイル書き出ししたい場合はFileLoggerをcurrentLoggerに設定するのが良さそう。

```c++
    // ユーザー/Library/Logs/JUCE/test_日付.txtにログ出力される。ログ冒頭にstart logging.と記述される。
    FileLogger* fileLogger = FileLogger::createDateStampedLogger("JUCE", "test_", ".txt", "start logging.");

    // ユーザー/Library/Logs/JUCE/test.txtにログ出力される。ログ冒頭にstart logging.と記述される。
    fileLogger = FileLogger::createDefaultAppLogger("JUCE", "test.txt", "start logging.");

    // [Mac] プラグインパッケージ/Contents/log.txtにログ出力される。ログ冒頭にstart logging.と記述される。
    fileLogger = new FileLogger(File::getSpecialLocation(File::currentApplicationFile)
                           .getChildFile("Contents")
                           .getChildFile("log.txt"),
                           "start logging.");

    // [Windows] C:¥Program Files¥Common Files¥VST3¥log.txtにログ出力される。ログ冒頭にstart logging.と記述される。
    fileLogger = new FileLogger(File::getCurrentWorkingDirectory().getChildFile("log.txt"), "start logging.");

    // インスタンスを使用してログ出力
    fileLogger->logMessage("test");

    // FileLoggerを使用してログの出力先をテキストファイルに変更
    Logger::setCurrentLogger(fileLogger); 
    Logger::getCurrentLogger()->WriteToLog("hoge");
```