2023-11-06
hashicorp/go-plugin でプラグイン機構を実装してます。 開発の都合でデバッグログを抑制したかったので、その方法をメモします。
hashicorp/go-plugin
hashicorp/go-plugin は hashicorp がOSSで開発しているパッケージです。 アプリケーションにプラグインシステムを組み込むことができます。terraform で採用されるなど事例も多いです。
Goでプラグイン機構を実現したいときは選択肢の一つになるのではないでしょうか。 そんな hashicorp/go-plugin でログ出力を抑制する方法を紹介します。
デフォルトでは..
何も意識することなく次のような Client を作ると..
package main import ( "os/exec" "github.com/hashicorp/go-plugin" ) func main() { client := plugin.NewClient(&plugin.ClientConfig{ HandshakeConfig: plugin.HandshakeConfig{ ProtocolVersion: 1, MagicCookieKey: "hey", MagicCookieValue: "hello", }, Plugins: pluginMap, Cmd: exec.Command("./plugin/aaa"), }) // プラグインを呼び出すコードが続く.. }
.. 下記のようなデバッグログが出力されます
2023-11-05T19:47:46.008+0900 [DEBUG] plugin: starting plugin: path=./plugins/aaa args=["./plugins/aaa"] 2023-11-05T19:47:46.009+0900 [DEBUG] plugin: plugin started: path=./plugins/aaa pid=21449 2023-11-05T19:47:46.009+0900 [DEBUG] plugin: waiting for RPC address: plugin=./plugins/aaa 2023-11-05T19:47:46.013+0900 [DEBUG] plugin: using plugin: version=1 2023-11-05T19:47:46.013+0900 [DEBUG] plugin.aaa: plugin address: address=/var/folders/yj/4j9Np7qG2sL6wA8xY1tR3fZ0vH/T/plugin2338200172 network=unix timestamp="2023-11-05T19:47:46.013+0900"
(当たり前ですがプラグイン機構は複雑なのでプラグインを呼び出すだけでそれなりの量のログが出ます)
上記のログはデバッグにはありがたいのですが、開発の都合で抑制したくなる時があるかと思います
Logger を渡す
hashicorp/go-plugin では Logger として hashicorp/go-hclog を用いているようで、 このインスタンスを渡してあげれば制御できます。
私は Info 以上のログだけ欲しかったので、次のように設定しました。
package main import ( "os/exec" "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-plugin" ) func main() { // logger を作成 logger := hclog.New(&hclog.LoggerOptions{ Name: "app", DisableTime: true, Level: hclog.Info, }) client := plugin.NewClient(&plugin.ClientConfig{ HandshakeConfig: plugin.HandshakeConfig{ ProtocolVersion: 1, MagicCookieKey: "hey", MagicCookieValue: "hello", }, Plugins: pluginMap, // logger を渡す Logger: logger, Cmd: exec.Command("./plugin/aaa"), }) // プラグインを呼び出すコードが続く.. }
プラグイン側でも go-hclog を用いてログ出力します。
package main import ( "github.com/hashicorp/go-plugin" ) func main() { logger := hclog.New(&hclog.LoggerOptions{ JSONFormat: true, }) logger.Info("something message") plugin.Serve(&plugin.ServeConfig{ HandshakeConfig: plugin.HandshakeConfig{ ProtocolVersion: 1, MagicCookieKey: "hey", MagicCookieValue: "hello", }, Plugins: pluginMap, }) }
すると次のようなログが出力されました。
[INFO] app.aaa: something message: timestamp="2023-11-05T20:06:23.363+0900"
Links
作成日
2023-11-06
更新日
2023-11-06