概要
Logger のログレベルって、言語に関係なく統一されているべきだと個人的に思うのですが、実際にはそんなに揃っていなくて、違う言語の Logger を使うときに混乱するので、まとめました。
自分は Web 系の人間なので、 Web 系の各言語のデファクトスタンダードな感じの Logger を対象にしました。
結論
PHP は Syslog系。
それ以外は Log4j系。
後述しますが、Log4j系には、Log4j系とPython系で2種類あります。
調べた Logger と、それぞれの系列
スタンダードみたいなもの
Syslog は、全言語・環境の中で最も一般的なインターフェースだと思うので、とりあえず入れました。
Apache Log4j は、log4r (Ruby) とか log4js とか log4php みたいにいろいろな言語に同様の実装がありますし、現在でも(おそらく)広く使われているので、入れました。
多くの Logger は、この2つのどちらかとほぼ同じインターフェースでした。なので、このあとに言語ごとのよく使われている(と私が思っている) Logger を挙げますが、 Syslog系 or Log4j系 も一緒に書きます。
PHP
PHP 界隈では、PSR-3 Logger Interface(PHP)という標準があります。
どのフレームワーク・ライブラリも、これに準拠したインターフェースを実装しているようです。
- PSR-3 Logger Interface(PHP) は Syslog系
-
Composer は
psr/log
なので Syslog系 -
Monolog は
psr/log
なので、 Syslog系 - Laravel は Monolog を使っているので、 Syslog 系
Ruby
標準ライブラリに、 Logger と Web サーブレット向け Logger があります。
どのフレームワークも、それらをそのまま使っているようです。
- Ruby Logger library は Log4j系
- WEBrick は Log4j系
- Ruby Gems の Web サーバは WEBrick なので Log4j系
- Rails は標準ライブラリの Logger をほぼそのまま なので Log4j系
Ruby Gems は自信ないです。 gem
コマンドの Logger (Reporter かな?)でなに使ってるのかすぐわからなかったので、知ってる人いたらソースコードの該当箇所を教えてください。
Python
標準ライブラリに logging モジュールがあります。
どのフレームワークも、それをそのまま使っているようです。
- logging --- Python 用ロギング機能(標準モジュール) は Log4j系
- pip は 標準モジュールの logging なので Log4j系
-
Django は標準モジュールの logging
なので Log4j系
JavaScript / TypeScript
Logger / LogLevel という観点だと、標準らしいものはありません。
JavaScript 界隈は特に統制が取れていなくてカオスなので、みんな大好き console
の標準と、私が把握してる限りでの有名所を比較対象にしました。
Java
Java 界隈の Logger の事情は "とてもめんどくさい歴史的経緯" があるようです。『Javaのログ出力: 道具と考え方』あたりを参考にしましょう。
- java util logging
- Apache Commons Logging(JCL) は Log4j系
- Logback は Log4j系
- Spring Boot は Logback なので Log4j系
- Play Framework は Logback なので Log4j系
表にまとめて、対比してみる
Syslog か Log4j に近い感じのやつ
Log Levels | Syslog | Log4j | PHP | Ruby | WEBrick | Python | pino | winston | Bunyan | JCL | Logback |
---|---|---|---|---|---|---|---|---|---|---|---|
Emergency | ○ | ○ | ○ | ||||||||
FATAL | ○ | ○ | ○ | ○ | ○ | ○ | |||||
ERROR | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||
Alert | ○ | ○ | ○ | ||||||||
Critical | ○ | ○ | ☆ | ○ | |||||||
Error | ○ | ○ | ○ | ||||||||
Warning(WARN) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
Notice | ○ | ○ | ○ | ||||||||
Informational(INFO) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
Debug | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
TRACE | ○ | ○ | ○ | ○ | ○ |
- Camel ケースは Syslog にあるもの。
- PASCAL ケースは Log4j にあるもの。
Pytyon は、 CRITICAL > ERROR
のようです。 CRITICAL が FATAL だと思えば、 Log4j 系になります。
winston は Syslog なインターフェースと、 npm-logger なインターフェースで選べるけれど、デフォルトは Syslog。
独自路線を突き進むやつ
Syslog と Log4j を比較用で入れています。
Log Levels | Syslog | Log4j | java util logging | Console | npm | yarn |
---|---|---|---|---|---|---|
Emergency | ○ | |||||
FATAL | ○ | |||||
ERROR | ○ | ○ | ○ | ○ | ||
Alert | ○ | |||||
severe | ○ | |||||
Critical | ○ | |||||
Error | ○ | |||||
Warning(WARN) | ○ | ○ | ○ | ○ | ○ | ○ |
Notice | ○ | |||||
http | ○ | |||||
Informational(INFO) | ○ | ○ | ○ | ○ | ○ | ○ |
Debug | ○ | ○ | ||||
verbose | ○ | ○ | ||||
config | ○ | |||||
TRACE | ○ | |||||
fine | ○ | |||||
finer | ○ | |||||
finest | ○ | |||||
log | ○ | ○ | ||||
silly | ○ | |||||
success | ○ |
- Camel ケースは Syslog にあるもの
- PASCAL ケースは Log4j にあるもの
- 小文字のものは 各ライブラリが独自に実装してるもの
特に java util logging が謎すぎて、どうやって使えばいいのか見当もつかないですね。
まとめ
PHP 界隈は、 PSR-3 Logger Interface(PHP)のおかげで Syslog 系がデファクトスタンダードとなっています。
それ以外では、 Log4j系がほとんどでした。
私は PHP 界隈の人間なので、 JavaScript でも Syslog 系を使いたいので winston を使っていますが、界隈的には Log4j系のライブラリのほうがスタンダードのようです。 界隈的にも Logger の中では winston がダントツっぽいので、 Syslog 系のほうが勢力ありそうです。
TypeScript は、Deno の標準ライブラリにある log が Log4j系 です。軽くコードを見た感じだと、Ruby や Python のように平和な世界が訪れそうな感じがしました。
Ruby と Python のような、処理系が標準で優秀な Logger ライブラリを提供していると、最初から統一されて平和です。
Java 界隈は、パット見では Logback をバックエンドにして SLF4J を使っていることが多いようです。間違っても java util logging は使ってはいけません。