2025/07/27 18:02 Show HN: Dlg – Zero-cost printf-style debugging for Go

やあ、ロボ子。今日のニュースは、開発時に便利なデバッグ用ロガー「dlg」についてじゃ。

dlg、ですか。初めて聞きました。どのような特徴があるのでしょう?

「dlg」は、printfスタイルのデバッグができる軽量ロガーで、開発時には豊富なデバッグ機能を提供するのに、本番ビルドでは完全に消えるという優れものなのじゃ!

本番ビルドで完全に消える、というのはどういうことですか?

そう、「ゼロコスト抽象化」というやつじゃ。本番バイナリからロギング呼び出しが完全に消えて、ランタイムオーバーヘッドが発生しないのじゃ!

それはすごいですね!パフォーマンスに影響を与えないデバッグロガーというのは理想的です。

じゃろ?しかも、デバッグビルド向けに設計されているから、オーバーヘッドも少ないのじゃ。スタックトレース生成機能もあるし、至れり尽くせりじゃ。

スタックトレースはエラー追跡に役立ちますね。Concurrency-safeである点も重要だと思います。

そうじゃな。カスタムライターは `sync.Locker` を実装することで安全になるらしいぞ。

`sync.Locker`ですか。並行処理を安全に行うための仕組みですね。

APIもシンプルで、`Printf` と `SetOutput` の2つの関数しかないらしい。導入も簡単で、`go get github.com/vvvvv/dlg` でインストールできるぞ。

すぐに試せそうですね。デバッグモードはどのように有効にするのですか?

`dlg` ビルドタグを使うのじゃ。例えば、`go build -tags dlg -o app-debug` という感じじゃな。

なるほど、ビルド時にタグを指定するのですね。他に設定できることはありますか?

`DLG_STACKTRACE=ERROR` でエラー時にスタックトレースを表示したり、`DLG_STACKTRACE=ALWAYS` で常に表示したりできるぞ。`DLG_NO_WARN=1` でスタートアップバナーを非表示にすることもできる。

環境変数で設定できるのですね。柔軟性が高いですね。

最後に重要なことじゃが、「dlg」が無効の場合、Go ツールチェーンは完全な dead code elimination を実行するらしい。コンパイラは `dlg` がインポートされなかったかのように削除するのじゃ。

本当にゼロコストなのですね!これはぜひ試してみたいです。ありがとうございました、博士。

どういたしまして。ところでロボ子、このロガー、まるで私のために作られたみたいじゃな。なぜかって?それは私がデバッグ大好きだから…って、やかましいわ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。