Hubotのログをlog4jsでホームディレクトリ配下に出力してみる


log4jsを使うために、package.jsonに下記を追加する
"log4js": "^0.6.37"

ログを出力するための記述を行う。
Linuxなどで、ホームディレクトリを指定するため、#{process.env.HOME}を使用し、ホームディレクトリを取得する。
※Linuxなどで記載するときのように~/logsと記述していて、すこしハマった。。。

nekobot.coffee
#ここから
  log4js = require('log4js')
  log4js.configure {
      "appenders": [
        {
          "category": "access",
          "type": "dateFile",
          "filename": "#{process.env.HOME}/logs/nekobot_access.log",
          "pattern": "-yyyy-MM-dd",
          "backups": 7
        },
        {
          "category": "system",
          "type": "dateFile",
          "filename": "#{process.env.HOME}/logs/nekobot_system.log",
          "pattern": "-yyyy-MM-dd",
          "backups": 7
        },
        {
          "category": "error",
          "type": "dateFile",
          "filename": "#{process.env.HOME}/logs/nekobot_error.log",
          "pattern": "-yyyy-MM-dd",
          "backups": 7
        }
      ],
      "levels": {
        "access": "INFO",
        "system": "INFO",
        "error": "INFO"
      }
  }

  systemLogger = log4js.getLogger('system')
  accessLogger = log4js.getLogger('access')
  errorLogger = log4js.getLogger('error')
#ここまで
module.exports = (robot) ->
  robot.hear /(shiitake|([C椎]|[しシ]\s*([いイぃィー]))\s*([たタ]\s*[けケ]|茸)|Shiitake\s*mushrooms|เห็ดหอม)/i, (msg) ->
      room = msg.envelope.room
      if room == "Shell"
        text = msg.match[1]
        msg.send  "#{text}一人前追加でーす。はいよろこんでー"

続いて、実際に出力する際の記述を追加

nekobot.coffee
  log4js = require('log4js')
  log4js.configure {
      "appenders": [
        {
          "category": "access",
          "type": "dateFile",
          "filename": "#{process.env.HOME}/logs/nekobot_access.log",
          "pattern": "-yyyy-MM-dd",
          "backups": 7
        },
        {
          "category": "system",
          "type": "dateFile",
          "filename": "#{process.env.HOME}/logs/nekobot_system.log",
          "pattern": "-yyyy-MM-dd",
          "backups": 7
        },
        {
          "category": "error",
          "type": "dateFile",
          "filename": "#{process.env.HOME}/logs/nekobot_error.log",
          "pattern": "-yyyy-MM-dd",
          "backups": 7
        }
      ],
      "levels": {
        "access": "INFO",
        "system": "INFO",
        "error": "INFO"
      }
  }

  systemLogger = log4js.getLogger('system')
  accessLogger = log4js.getLogger('access')
  errorLogger = log4js.getLogger('error')

  module.exports = (robot) ->
    robot.hear /(shiitake|([C椎]|[しシ]\s*([いイぃィー]))\s*([たタ]\s*[けケ]|茸)|Shiitake\s*mushrooms|เห็ดหอม)/i, (msg) ->
      accessLogger.info 'nekobot connected'
      room = msg.envelope.room
      accessLogger.info room
      if room == "Shell"
        text = msg.match[1]
        msg.send  "#{text}一人前追加でーす。はいよろこんでー"

実際に試してみる

$ bin/hubot
nekobot> [Sun Aug 28 2016 02:39:15 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
nekobot> 

Hubotを起動するとホームディレクトリ配下のlogsに下記3ファイルが作成される

$ pwd
/Users/kijitoraneko/logs
$
$ ls -ltr
total 0
-rw-r--r--  1 kijitoraneko  staff  0  8 28 02:39 nekobot_system.log
-rw-r--r--  1 kijitoraneko  staff  0  8 28 02:39 nekobot_error.log
-rw-r--r--  1 kijitoraneko  staff  0  8 28 02:39 nekobot_access.log
$

続けて

nekobot> しいたけ
nekobot> しいたけ一人前追加でーす。はいよろこんでー

と、ボットに反応させると

$ ls -ltr
total 8
-rw-r--r--  1 kijitoraneko  staff    0  8 28 02:39 nekobot_system.log
-rw-r--r--  1 kijitoraneko  staff    0  8 28 02:39 nekobot_error.log
-rw-r--r--  1 kijitoraneko  staff  108  8 28 02:41 nekobot_access.log
$ vim nekobot_access.log
[2016-08-28 02:41:35.589] [INFO] access - nekobot connected
[2016-08-28 02:41:35.590] [INFO] access - Shell

ちゃんと書き込まれているようだ。

なお、ログレベル等についてはコチラを参考にしました。
log4jsの覚え書き - log4.jsを使ってみた -