Hubot のログ情報 (`Robot#logger`) まとめ

# 問題

Hubot のログやロガー (`Robot#logger`) についての情報が少ない。

公式 (v2.11.2) のドキュメントには、かろうじて利用例が掲載されているだけで、その他の情報はざっと検索した限りでは存在を確認できない。

唯一のドキュメント: https://github.com/github/hubot/blob/v2.11.2/docs/scripting.md#error-handling

```coffeescript
# src/scripts/does-not-compute.coffee
module.exports = (robot) ->
  robot.error (err, msg) ->
    robot.logger.error "DOES NOT COMPUTE"

    if msg?
      msg.reply "DOES NOT COMPUTE"
```

# 解決策

ソースコードを読み、以下にまとめる。

# 結論: npm パッケージの log

npm パッケージの log を使っている。その README およびソースコードを読めば良い。

- NPM: https://www.npmjs.com/package/log
- GitHub: https://github.com/tj/log.js

# Hubot 2.11.2 での log のバージョンは 1.4.0

[Hubot v2.11.2](https://github.com/github/hubot/tree/v2.11.2) では [log 1.4.0](https://github.com/tj/log.js/tree/1.4.0) を使っている。

https://github.com/github/hubot/blob/v2.11.2/src/robot.coffee#L2

```coffee:robot.coffee
Log = require 'log'
```

https://github.com/github/hubot/blob/v2.11.2/src/robot.coffee#L50

```coffee:robot.coffee
@logger = new Log process.env.HUBOT_LOG_LEVEL or 'info'
```

https://github.com/github/hubot/blob/v2.11.2/package.json#L26

```json:package.json
"dependencies": {
  "coffee-script": "1.6.3",
  "optparse": "1.0.4",
  "scoped-http-client": "0.10.0",
  "log": "1.4.0",
  "express": "3.18.1",
  "readline-history": "~1.2.0"
},
```

# ログレベル指定は環境変数 HUBOT_LOG_LEVEL

環境変数 HUBOT_LOG_LEVEL でログレベル (`Log` のコンストラクタへの引数) を指定できる。デフォルトでは 'info' が使われる。

https://github.com/github/hubot/blob/v2.11.2/src/robot.coffee#L50

```coffee:robot.coffee
@logger = new Log process.env.HUBOT_LOG_LEVEL or 'info'
```

# ログレベルの一覧

指定できるログレベルの一覧は `log` の README を参照。 syslog に従った値である。

https://github.com/tj/log.js/tree/1.4.0#log-levels

> Mirror that of syslog:
> 
>     0 EMERGENCY system is unusable
>     1 ALERT action must be taken immediately
>     2 CRITICAL the system is in critical condition
>     3 ERROR error condition
>     4 WARNING warning condition
>     5 NOTICE a normal but significant condition
>     6 INFO a purely informational message
>     7 DEBUG messages to debug an application

# ログレベル指定の大文字小文字の区別

ログレベルの指定時に大文字小文字の区別はない。

https://github.com/tj/log.js/blob/1.4.0/lib/log.js#L24

```javascript:log.js
var Log = exports = module.exports = function Log(level, stream){
  if ('string' == typeof level) level = exports[level.toUpperCase()];
```

https://github.com/tj/log.js/blob/1.4.0/lib/log.js#L36

```javascript:log.js
exports.EMERGENCY = 0;
```

# ログ出力メソッドの一覧

上記、ログレベルに対応するメソッドと `log` とが用意されている。

- `Log#log`
- `Log#emergency`
- `Log#alert`
- `Log#critical`
- `Log#error`
- `Log#warning`
- `Log#notice`
- `Log#info`
- `Log#debug`

https://github.com/tj/log.js/blob/1.4.0/lib/log.js#L138-L244

なので、Hubot からは以下のメソッドを使える。

- `Robot#logger#log`
- `Robot#logger#emergency`
- `Robot#logger#alert`
- `Robot#logger#critical`
- `Robot#logger#error`
- `Robot#logger#warning`
- `Robot#logger#notice`
- `Robot#logger#info`
- `Robot#logger#debug`


## 参考

- [npm: hubot](https://www.npmjs.com/package/hubot)
- [npm: log](https://www.npmjs.com/package/log)
- [github/hubot@2.11.2](https://github.com/github/hubot/tree/v2.11.2)
- [tj/log.js@1.4.0](https://github.com/tj/log.js/tree/1.4.0)
- [@bouzuya の Hubot 連載をふりかえってみた - Qiita](http://qiita.com/bouzuya/items/7d44aa798a0c113d2dde#robotlogger)
- [Hubotのログレベルを指定する - Qiita](http://qiita.com/udzura/items/ff2d1885647f58cc40b4)