2020年2月13日木曜日

go-workers のカスタムロギングで標準出力と標準エラーを分けるコツ

概要

過去に go-workers でライブラリ自体のロギングをカスタムする方法を紹介しました
基本的には標準出力に出力されるようで標準エラーにエラーの内容を分けたい場合は少しコツがいるようです

環境

  • macOS 10.15.2
  • golang 1.12.9
  • go-workers dbf81d0b75bbe2fd90ef66a07643dd70cb42a88a

サンプルコード

全体のコードは過去の記事を参考にしてください
ポイントとなる Println の部分だけ紹介します

func (l *MyLogger) Println(kv ...interface{}) {
    msg := ""
    elog := false
    for _, v := range kv {
        switch v.(type) {
        case string:
            msg += v.(string) + " "
        case int:
            msg += strconv.Itoa((v.(int))) + " "
        case error:
            elog = true
            msg += v.(error).Error() + " "
        }
    }
    if elog {
        log.SetOutput(ioutil.Discard)
        log.SetOutput(os.Stderr)
        log.Println(msg)
    } else {
        log.SetOutput(os.Stdout)
        log.Println(msg)
    }
}

どうやら標準エラーのみ出力したいログの場合には直前に log.SetOutput(ioutil.Discard) を実行する必要がありそうです
もじ log.SetOutput(ioutil.Discard) していないと elog に入った場合でも標準出力にログが出力されてしまいます

0 件のコメント:

コメントを投稿