Goのエラーハンドリングでよく見る形のこんなコードを書いていました
if err != nil {
log.Fatal(err)
return err
}
コレで試してみるとエラーのときに強制的にプログラム終了。。。
何が起こっていたか
log.Fatal
の挙動を調べてみたらすぐに分かりました。
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
std.Output(2, fmt.Sprint(v...))
os.Exit(1)
}
os.Exit(1)
でプログラムが終了してしまうみたい。。。
ついでにログレベルを調べてみた
ログレベル | 説明 | 例 |
---|---|---|
emergency | システムが使用不可能な状態 | |
fatal | 致命的なエラー | プログラムの異常終了を伴うようなもの |
alert | すぐに何らかの対処が必要 | アプリケーションがダウン。Slackなどで通知するべき |
critical | 危機的な状態 | 予期しない例外 |
error | 直ちに対処する必要のない実行時エラー | |
warning | エラーではないが例外的なもの | 間違っていないが望ましくないものの使用 |
notice | 正常だが、重要なもの | |
info | 関心を寄せておきたいもの | ユーザーのログインやSQL |
debug | 開発中のデバッグ情報 | |
trace | トレース情報。詳細な情報。 |
この表はなんとなくイメージを掴むためのものなのでいろんなロギングツールを混ぜたものなので注意
言語ごとにログのライブラリがあるのでそれに準ずるのが良さそう。
参考
ちなみに
Goの標準パッケージであり log
で定義されてるログを出力する関数は
- Fatal
- Panic
の3つしかない
外部パッケージや自作して適切なログレベルを定義していくのが良さそう。
参考