goのlog系パッケージ標準エラー吐きがち説

goのロギングパッケージはstderrがお好き

早めに出社したらちょっとハマったので調べた

TL;DR

fmt.Println()はstdoutに吐くのにlog.Println()はstderrに吐くから気をつけようね。

世の中には2種類の標準出力しかいねえ()

  1. 標準出力(stdout)
  2. 標準エラー出力(stderr)

あれ、log.Println()がerror出力に吐いてるぞ?と思った我々取材班はアマゾンに飛んだ

func Println(v ...interface{}) {
 std.Output(2, fmt.Sprintln(v...))
}

stdってなんやねん・・・とソースを上にスクロールするといた

var std = New(os.Stderr, "", LstdFlags)
お前標準エラー出力やないか!!!!

Overviewにも書いてあるからぐうの音も出ない
Package log implements a simple logging package. It defines a type, Logger, with methods for formatting output. It also has a predefined 'standard' Logger accessible through helper functions Print[f|ln], Fatal[f|ln], and Panic[f|ln], which are easier to use than creating a Logger manually. That logger writes to standard error and prints the date and time of each logged message. Every log message is output on a separate line: if the message being printed does not end in a newline, the logger will add one. The Fatal functions call os.Exit(1) after writing the log message. The Panic functions call panic after writing the log message.

ちなみにfmtは

fmt.Printlnのソース
func Println(a ...interface{}) (n int, err error) {
 return Fprintln(os.Stdout, a...)
}

fmtちゃんはマジで真面目でいい子じゃん!あの子の悪口言うのやめろよ!!

ちなみにlogrusとzapもそのまま使うとstderrに吐くよ。

結論

gopherはログをエラー出力に吐かないと死ぬ呪いにかかってるので、ログ出力先を気にしないといけないときには覚えておいたほうがいい。

このブログの人気の投稿

2016年にgoを使ったのでまとめ

採用とは何か

エンジニアの妻になってしまった我が妻には感謝している