Web系の言語で使われている Logger のログレベルをまとめてみた

## 概要
Logger のログレベルって、言語に関係なく統一されているべきだと個人的に思うのですが、実際にはそんなに揃っていなくて、違う言語の Logger を使うときに混乱するので、まとめました。
自分は Web 系の人間なので、 Web 系の各言語のデファクトスタンダードな感じの Logger を対象にしました。

## 結論

PHP は Syslog系。
それ以外は Log4j系。
[後述しますが](https://qiita.com/ndxbn/items/c4d2d745d464ebabd279#syslog-%E3%81%8B-log4j-%E3%81%AB%E8%BF%91%E3%81%84%E6%84%9F%E3%81%98%E3%81%AE%E3%82%84%E3%81%A4)、Log4j系には、Log4j系とPython系で2種類あります。

## 調べた Logger と、それぞれの系列
### スタンダードみたいなもの

- [Syslog](https://tools.ietf.org/html/rfc5424#section-6.2.1)
- [Apache Log4j （log4j2）](https://logging.apache.org/log4j/2.x/manual/customloglevels.html)

Syslog は、全言語・環境の中で最も一般的なインターフェースだと思うので、とりあえず入れました。

Apache Log4j は、[log4r （Ruby)](https://github.com/colbygk/log4r) とか [log4js](https://github.com/log4js-node/log4js-node) とか [log4php](https://logging.apache.org/log4php/) みたいにいろいろな言語に同様の実装がありますし、現在でも（おそらく）広く使われているので、入れました。

多くの Logger は、この2つのどちらかとほぼ同じインターフェースでした。なので、このあとに言語ごとのよく使われている（と私が思っている） Logger を挙げますが、 Syslog系 or Log4j系 も一緒に書きます。

### PHP
PHP 界隈では、[PSR-3 Logger Interface(PHP)](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)という標準があります。
どのフレームワーク・ライブラリも、これに準拠したインターフェースを実装しているようです。

- [PSR-3 Logger Interface(PHP)](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md#3-psrlogloggerinterface) は Syslog系
- [Composer は `psr/log`](https://github.com/composer/composer/blob/master/composer.json#L38) なので Syslog系
- [Monolog は `psr/log`](https://github.com/Seldaek/monolog/blob/1417e2d183a12996c7a626985e2c6ce32dd08b3e/composer.json#L17) なので、 Syslog系
- [Laravel は Monolog を使っている](https://github.com/laravel/framework/blob/27b88449805c1e9903fe4088f303c0858336b23b/composer.json#L25)ので、  Syslog 系

### Ruby
標準ライブラリに、 Logger と Web サーブレット向け Logger があります。
どのフレームワークも、それらをそのまま使っているようです。

- [Ruby Logger library](https://docs.ruby-lang.org/ja/latest/library/logger.html) は Log4j系
- [WEBrick](https://docs.ruby-lang.org/ja/latest/class/WEBrick=3a=3aBasicLog.html) は Log4j系
- [Ruby Gems の Web サーバは WEBrick](https://github.com/rubygems/rubygems/blob/5a4426dbcf17bd995f5e0290fc97bcfc28f7bae4/lib/rubygems/server.rb#L442) なので Log4j系
- [Rails は標準ライブラリの Logger をほぼそのまま](https://github.com/rails/rails/blob/589dd0f6c9b5d6fe9de88b7bdabe83681abde2a4/activesupport/lib/active_support/logger.rb#L8) なので Log4j系

Ruby Gems は自信ないです。 `gem` コマンドの Logger （Reporter かな？）でなに使ってるのかすぐわからなかったので、知ってる人いたらソースコードの該当箇所を教えてください。

### Python
標準ライブラリに logging モジュールがあります。
どのフレームワークも、それをそのまま使っているようです。

- [logging --- Python 用ロギング機能（標準モジュール）](https://docs.python.org/ja/3.6/library/logging.html) は Log4j系
- [pip は 標準モジュールの logging](https://github.com/pypa/pip/search?utf8=✓&q=logger&type=) なので Log4j系
- [Django は標準モジュールの logging](https://github.com/django/django/blob/c68f66e0144b69367e98692cba313251a36b85a8/django/utils/log.py#L1)
 なので Log4j系

### JavaScript / TypeScript
Logger / LogLevel という観点だと、標準らしいものはありません。

JavaScript 界隈は特に統制が取れていなくてカオスなので、みんな大好き `console` の標準と、[私が把握してる限りでの有名所](https://npmcompare.com/compare/bunyan,pino,winston)を比較対象にしました。

- [Console](https://console.spec.whatwg.org/#loglevel-severity)
- [npm](https://github.com/npm/npmlog#loglevelprefix-message-)
- [yarn](https://github.com/yarnpkg/yarn/blob/9533405a9413b12b29aec9a5096f04c2176ebe78/src/reporters/base-reporter.js)
- [pinojs](https://github.com/pinojs/pino/blob/master/docs/API.md#level) は Log4j系
- [winston](https://github.com/winstonjs/winston#logging-levels) は Syslog系
- [Bunyan](https://github.com/trentm/node-bunyan) は Log4j系
- [Deno](https://github.com/denoland/deno/tree/940f8e8433ae5ec74b2642438849089a0433e512/std/log)は Log4j系（Python系）

### Java
Java 界隈の Logger の事情は "とてもめんどくさい歴史的経緯" があるようです。[『Javaのログ出力: 道具と考え方』](https://www.slideshare.net/miyakawataku/concepts-and-tools-of-logging-in-java)あたりを参考にしましょう。

- [java util logging](https://docs.oracle.com/javase/jp/6/api/java/util/logging/Level.html)
- [Apache Commons Logging（JCL）](https://commons.apache.org/proper/commons-logging/guide.html#Message_PrioritiesLevels) は Log4j系
- [Logback](https://github.com/qos-ch/logback/blob/master/logback-classic/src/main/java/ch/qos/logback/classic/Level.java) は Log4j系
- [Spring Boot は Logback](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html) なので Log4j系
- [Play Framework は Logback](https://www.playframework.com/documentation/2.6.x/ScalaLogging) なので 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`](https://docs.python.org/ja/3.6/library/logging.html#levels)のようです。 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)](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)のおかげで Syslog 系がデファクトスタンダードとなっています。
それ以外では、 Log4j系がほとんどでした。

私は PHP 界隈の人間なので、 JavaScript でも Syslog 系を使いたいので winston を使っていますが、~~界隈的には Log4j系のライブラリのほうがスタンダードのようです。~~ 界隈的にも Logger の中では winston がダントツっぽいので、 Syslog 系のほうが勢力ありそうです。

TypeScript は、Deno の標準ライブラリにある log が Log4j系 です。軽くコードを見た感じだと、Ruby や Python のように平和な世界が訪れそうな感じがしました。

Ruby と Python のような、処理系が標準で優秀な Logger ライブラリを提供していると、最初から統一されて平和です。

Java 界隈は、パット見では Logback をバックエンドにして [SLF4J](https://www.slf4j.org) を使っていることが多いようです。間違っても java util logging は使ってはいけません。