ロギングプラグインの実装方法

---
### StreamRelay.NET.exe のロギング実行機能を呼び出しているプラグインの実装方法について説明する

StreamRelay.NET.exe/StreamRelay.NET.x86.exeには、いくつかの機能をプラグインとして実装できるようにインターフェイスを公開している。

今回は、ロギングを実行するためのインターフェイスを使って、プラグインを作成する方法を記述する。

---
### 既存のプラグイン

コンソールに出力するロギングや、WindowsFormを作成してそこに表示するタイプや、データ量(通信速度)だけ表示するロギングなどがある。

プラグイン的には、このあたり。

- Plugins\Plugin.LoggingConsoleAndFile.dll
- Plugins\Plugin.LoggingGUI.dll


---
### 実装したプラグインの呼び出され方

StreamRelay.NET.exeは、Streamクラスのread() でデータを読み取り、もう一つのStreamクラスのwrite()で書き出されるんですが、その時にロギング機能が呼び出される。

という感じ。

![LoggingPlugin01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/7a6f50ec-ff81-bae9-18b5-d71752204a92.png)

---
### 実装するインターフェイス

以下のインターフェイスを継承したクラスを実装すればよい

- IPlugin.dll 中の jp.dip.rocketeer.Plugins.IPluginLogging インターフェイス

ロギングは指定方法によって、複数のオブジェクトを生成する必要はないので、このクラス一つだけ実装すればよい。

---
### jp.dip.rocketeer.Plugins.IPluginLogging インターフェイス

StreamRelay.NET.exeが、引数/オプションの解析処理中に呼び出して、引数の指定内容によって有効化していれば、プロパティ「**IsEnable=true**」にして、ロギング機能を有効にする。

そうすると、StreamRelay.NET.exeのロギング時に **void Logging(LoggingItem item)** が呼び出される。

という感じ。

具体的には、起動直後の引数/オプションの解析処理中に、
**int Args(String iStr1, String iStr2, String iStr3);**
を呼び出すので、自分の引数であれば、プロパティ「IsEnable=true」にしてくれればよい。
自分の引数でなければ、0を返す。

より、具体的には、
例えば、
`c:\>StreamRelay.NET.exe a b c d e f`
というコマンドラインで起動したら、

1. iStr1=a, iStr2=b,　iStr3=c, で、Args() を呼び出し、
2. iStr1=b, iStr2=c,　iStr3=d, で、Args() を呼び出し、
3. iStr1=c, iStr2=d,　iStr3=e, で、Args() を呼び出し、
4. iStr1=d, iStr2=e,　iStr3=f, で、Args() を呼び出し、
5. iStr1=e, iStr2=f,　iStr3=NULL, で、Args() を呼び出し、

という感じ・・・

例えば、iStr1=b, iStr2=c,　iStr3=d, の時、自分の引数ということで、iStr1=b, iStr2=c, を Args() で使用したら、2を返す。すると次は iStr1=d, iStr2=e,　iStr3=f, で、Args() が呼び出される。

ということになっている。

---
#### jp.dip.rocketeer.Plugins.IPluginLogging インターフェイスで定義しているメソッド/プロパティ

実装する必要があるのは以下

jp.dip.rocketeer.Plugins.IPluginLoggingインターフェイスで定義されているのは、以下のとおり

<dl>
 <dt><b>String[] usage { get; }</b>
  <dd>ヘルプに引数を表示する際に呼び出される
 <dt><b>int Args(String iStr1, String iStr2, String iStr3)</b>
  <dd>引数の解析中に呼び出される
 <dt><b>void Enable(String iStr1)</b>
  <dd>有効化する。GUIなどから指定される事を想定している
 <dt><b>Boolean IsEnable { get; }</b>
  <dd>有効かどうか返す(つまり引数で指定されたかされていないか)
 <dt><b>void init(PluginManagePublicObj iObj)</b>
  <dd>他のプラグイン(乱数とか文字コードとか)も操作できるオブジェクトを渡す。PluginManagePublicObj型の変数を宣言して、それにセットすればよい
 <dt><b>String InfomationConfigString{ get; }</b>
  <dd>現在の状態を表示する(設定を受け取っての状態(Verboseモード時や接続状態の表示時に呼び出される))
 <dt><b>void Logging(LoggingItem item)</b>
  <dd>ロギング情報として呼び出される
 <dt><b>void Close()</b>
  <dd>サービスとして動作しているような場合の終了処理を記述する(例: ローカルで、TCPサーバとして起動している場合のサーバの停止処理(接続中のストリームの停止処理は、別途しているので、待ち受けサーバの停止処理だけ記述すればよい))
</dl>

jp.dip.rocketeer.Plugins.IPluginBaseインターフェイスで定義されている分については、[インターフェイス IPluginBase について](https://qiita.com/tomoki0sanaki/items/60613c29f0d627353e67)を参照

---
### jp.dip.rocketeer.Plugins.LoggingItem オブジェクト

Logging(LoggingItem item) の引数**LoggingItemオブジェクト**の、メソッド/プロパティは、以下のような感じ。

これらのメソッド/プロパティを操作してくれればよい。

<dl>
 <dt><b>public readonly String HeaderStr</b>
  <dd>ログのヘッダ(主に通信端末情報)
 <dt><b>public readonly String message</b>
  <dd>ログメッセージ(文字列)または、エラーメッセージ
 <dt><b>public readonly Byte[] hako</b>
  <dd>ログメッセージ(バイナリ)
 <dt><b>public readonly Boolean IsRequest</b>
  <dd>リクエストかレスポンスか
 <dt><b>public readonly Boolean IsVerbose</b>
  <dd>バーバスモードかどうか
 <dt><b>public readonly Boolean IsDebugMode</b>
  <dd>デバグモードかどうか
 <dt><b>public readonly Boolean IsError</b>
  <dd>エラーログかどうか
 <dt><b>public readonly LoggingType type</b>
  <dd>ログのタイプ
 <dt><b>public readonly DateTime LogTime</b>
  <dd>ログ時間
 <dt><b>public String LogTimeStr()</b>
  <dd>ログの時間を文字列として返す
</dl>

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)