本文へスキップ

Go Agent v0.4.3

2024年10月16日

Fixedos.Stdoutos.Stderrログ収集エラーを修正

  • trace.Init関数でログ収集機能を有効にするように修正します。 できるだけ他のログライブラリよりも先に実行できるように変更します。

  • os.Stdoutos.Stderrをラッピングしたio.Writerが使用できる関数を追加しました。


以下は、変更されたログ収集機能の使用についてのご案内です。

エージェント設定

アプリケーション実行前にwhatap.confファイルにエージェントオプションを設定ます。

whatap.conf
logsink_enabled=true

# Enable stdout collection
logsink_stdout_enabled=true

# Enable stderr collection
logsink_stderr_enabled=true

# Optional. This is a setting for compressing data.
logsin_zip_enabled=true

ログライブラリの初期化前

先にtrace.Init()関数を呼び出す必要があります。 内部的にos.Stdoutos.Stderrをラッピングします。 その後、ログライブラリがos.Stdoutos.Stderrを設定すると、自動的にログを収集します。

zapライブラリの例

os.Stdoutを設定する前にtrace.Init()関数を呼び出すと、自動的にログを収集します。 os.Stdout出力は維持しながら、同時にWhaTapログに収集します。

zap library example
import (
"github.com/whatap/go-api/trace"
"github.com/whatap/go-api/logsink"

"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)

func main() {
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()

// fmt.Println("Logger stdout=", os.Stdout, zapcore.AddSync(os.Stdout))
consoleCore := zapcore.NewCore(
zapcore.NewConsoleEncoder(consoleEncoderConfig),
zapcore.AddSync(os.Stdout),
zap.InfoLevel,
)

// Menggabungkan core file dan console
core := zapcore.NewTee(consoleCore)
Log = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
Log.Info("logger started")

...
}

ログライブラリの初期化以降

ログライブラリの設定関数によってラッピングしたio.Writerを設定できます。

  • logsink.GetWriterHookStdout()os.Stderrをラッピングしたio.Writerを返します。 os.Stdoutに出力すると同時に、そのログをWhaTapログに収集します。

  • logsink.GetWriterHookStderr()os.Stderrをラッピングしたio.Writerを返します。 ラッピングしたio.Writeros.Stderrに出力後、ログの内容をWhaTapログに収集します。

  • logパッケージ

    import視点(init 関数)でos.Stderrを設定します。 trace.Init関数を先に呼び出すことができないため、ラッピングしたio.Writer(os.Stderr)をlog.SetOutput関数を通じて設定します。

以後使用されるlogパッケージのprint関数を使用した出力は、ラッピングした io.Writerを通じてos.Stderrに出力後、ログの内容をWhaTapログに収集します。

log package
import (
"log"
"github.com/whatap/go-api/logsink"
)

...

if logsink.GetWriterHookStderr() != nil {
// set single writer
log.SetOutput(logsink.GetWriterHookStderr())

// set multi writer
multi := io.MultiWriter(file, logsink.GetWriterFromStderr())
log.SetOutput(logsink.GetWriterHookStderr())
}

//
log.Println("aaaaa")

...

情報

ダウンロード