Help us understand the problem. What is going on with this article?

[Node.js]Express4 + log4jsでロギング

More than 5 years have passed since last update.

Express4 + log4jsでロギング

兎にも角にも「ログ」は大事。

Express4 + log4jsでロギングをつくっていく。
まずはlog4jsモジュールのインストール。

npm install log4js --save

用意するログの種類は以下の通りとする。

category 用途
access アクセスログ
error エラーログ
system 上記二つに当てはまらないもの

各ログの設定を作るのだが、例によって環境によって動作を変えたいと思う。
例えば、本番環境ではデバッグ用のログは吐き出す必要はない。

環境ごとに設定をつくる方法はExpress4で環境ごとの設定をつくるに書いたので参考に。

vi config/development.json
{
  "log4js": {
    "appenders": [{
      "category": "access",
      "type": "dateFile",
      "filename": "/tmp/access.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {
      "category": "system",
      "type": "dateFile",
      "filename": "/tmp/system.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {
      "category": "error",
      "type": "dateFile",
      "filename": "/tmp/error.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {"type": "console"}],
    "levels": {
      "access": "ALL",
      "system": "ALL",
      "error": "ALL"
    }
  }
}

appendars要素にログの種類分の設定をしている。

要素 内容
category 種類を特定できる文字列
type console(コンソール) file(ファイル) dateFile(rotate付ファイル)
filename 出力先ファイル名
pattern dateFileの場合のファイル末尾のパターン
backups 過去分としてのこしておくログファイル数

appendars要素に {"type": "console"} も設定しておくと、ファイル書き出しと同時にコンソールにも表示してくれて便利。

levels要素は対象のログ種類で、どのレベル以上のログを書き出し可能かを制御できる。

レベル 内容
ALL 全てのログが書き出される
DEBUG DEBUG以上のログが書き出される
INFO INFO以上のログが書き出される
WARN WARN以上のログが書き出される
ERROR ERROR以上のログが書き出される

設定を読み込んでロガーを初期化するコードを毎回書くのが面倒なので、モジュール化しておく。

mkdir modules
vi modules/logger.js
var log4js = require('log4js');
var config = require('config');

log4js.configure(config.log4js);

module.exports = { 
  access: log4js.getLogger('access'),
  system: log4js.getLogger('system'),
  error: log4js.getLogger('error'),
  express: log4js.connectLogger(log4js.getLogger('access'), {level: log4js.levels.INFO})
};

最後にExpressのデフォルトロガーをlog4jsに変更する。

vi app.js
...
...
// デフォルトはmorganというモジュールを使っているので、コメントアウトして作成したモジュールを使う。
//var logger = require('morgan');
var logger = require('./modules/logger');
...
...
// app.use(logger('dev'))している行をコメントアウトして、logger.expressをapp.useする
//app.use(logger('dev'));
app.use(logger.express);

ここまで出来ればあとは使うだけ。

var logger  = require('./modules/logger');
logger.system.info({
  name: "tnnsst35",
  message: "byebye"
});

以上。

tnnsst35
スマートフォン向けゲームの開発しています。WEB開発の出身なので、LL言語やRDBを使ったサーバーサイド開発、Unityを使ったクライアント開発を得意としています。最近はプリンシパルエンジニアみたいなこともしています。
http://tnnsst35.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away