Debug,Info,Warning,Error,Criticalのうち、本当に必要なログはどれ?

昔からログといえばUNIXのsyslogに則るのが普通と思っていたが、TwitterでDave Cheneyという人が2015年に書いた考え方が話題になっていた。

Go’s log package doesn’t have leveled logs, you have to manually add prefixes like debug, info, warn, and error, yourself. Also, Go’s logger type doesn’t have a way to turn these various levels on or off on a per package basis.

大抵の言語では標準でログ出力の機能を持っているが、Goではinfoやwarnといったプレフィックスを自分で付けるか、よそのライブラリを使わなければいけない。まず、ここが議論の出発点だ。

Let’s start with the easiest one. Nobody needs a warning log level. Nobody reads warnings, because by definition nothing went wrong. Maybe something might go wrong in the future, but that sounds like someone else’s problem.

まず、Warningについて。Errorなら処理が止まってしまうから見るかもしれないが、Warningって誰も読まないのではないか。将来的には問題になるとしても、それはエラーを見る人の問題ではなく、別の誰かの問題だろうというのが彼の考え。つまりInfoとErrorの2つでいいんじゃないか。

In effect, log.Fatal is a less verbose than, but semantically equivalent to, panic. It is commonly accepted that libraries should not use panic, but if calling log.Fatal has the same effect, surely this should also be outlawed.

fatalは異常終了を表すもので、panicと等価だ。そのpanicはライブラリでは使うべきではないとされているのだから、同じようにfatalもoutlawではないのか。

panicといえば、他の言語では意図的に例外処理したい場合に使われるが、goでは例外はサポートしていないにも関わらずpanicはサポートしている。そのため、他の言語でも同じように議論できるか微妙だ。

If you choose to handle the error by logging it, by definition it’s not an error any more — you handled it. The act of logging an error handles the error, hence it is no longer appropriate to log it as an error.

最後にエラーについて。ログ出力することでエラー処理したということは、定義上はエラーではなくて、処理したということだよねと。

個人的には、この主張は苦しいんじゃないかと思うが、彼の主張を突き詰めていくと、ログは利用者が気にするものと開発者が気にするものの2つに分類されるべきという結論になる。

彼の主張がどれぐらい浸透しているかは調べられなかったが、スマートフォンの開発の現場などは、すでにError/Warningといった、誰に向けたものかわからないログではなく、ユーザ向け/開発者向けになっている気もする。









この記事が気に入ったらサポートをしてみませんか?