log4jsで独自のログを出力する(Node.jsその5)

Express.jsにはデフォルトのログ出力にmorganが組み込まれています
morganは、サーバーがリクエストを受け取った際のログを出力しますが、任意の箇所でのログ出力はできません

どのようなログ(エラーログ・アクセスログなど)を、どのタイミングで、どこに(コンソール・ファイルなど)に出力するか?

npm install log4js --save
目次
  1. 使い方
  2. AppenderとCategory
  3. コンソールにログ出力
  4. エラーログをファイルに出力する
  5. アクセスログをファイルに出力する

使い方

最も基本の形
getLoggerでログ出力を行うインスタンloggerを取得します
loggerのメソッド(ログレベル)を使ってログ出力を行います

var log4js = require("log4js");

var logger = log4js.getLogger();

//ログの出力
logger.debug("some messages");

ログレベルについて

ログレベルには、all < trace < debug < info < warn < error < fatal < mark < off があります
指定したログレベル以上のログが出力されます

logger.ログレベル(ログ出力したいメッセージ)

ログ種別(カテゴリー)や出力方法、出力先の設定
log4js.configure(options)で設定します
Appendersは、キーにアペンダー名、バリューに出力先のタイプ
Categoriesは、キーにカテゴリー名、バリューに該当カテゴリーの設定
*defaultカテゴリーは必須

log4js.configure({
  appenders:{
    
  },
  categories:{

  }
})

AppenderとCategory

Categoriesで設定されたAppendersにログが送られます

  • Appender
    ログの出力(方法や出力先)を担当します
    ログの出力先や出力するログのレベルを変更したりします
  • Category
    ログを分類する為のカテゴリーで、カテゴリー単位でログ出力します
    defaultは必須
    Appender(方法や出力先)を指定します
    Appenderをグループ化して、モジュール単位などで分けて使ったりもします

Appenderの出力先がファイルの場合のオプションや設定

getLoggerはcategoriesで設定したカテゴリー名を引数に取ります
*カテゴリー名が”default”の場合は引数不要です

log4js.getLogger(カテゴリー名)

コンソールにログ出力

コンソールログ出力を作る(logger.jsファイルを作成)

const express = require("express");
const app = express();

const log4js = require("log4js");
//log4jsの設定
log4js.configure({
    appenders: {
        ConsoleLog: {
        type: "console"
        }
    },
    categories: {
        default: {
//appendersの配列の値はアペンダー名(アペンダーにキー)
        appenders: ["ConsoleLog"],
        level: "ALL"
        }
    }
});
//getLoggerの引数はカテゴリー名(カテゴリーのキー)defaultは省略可
const logger = log4js.getLogger();

app.listen(3000);
//ログ出力
logger.info('3000ポートでサーバー起動');

エラーログをファイルに出力する

設定ファイル(log4js.config.js)をモジュールで切り出す
エラーログを、保存容量の上限を決めてファイルに出力する設定

const path = require("path");
//ログファイルの出力先を環境環境変数で指定、環境変数がなければlogsフォルダ直下
const LOG_ROOT_DIR = process.env.LOG_ROOT_DIR || path.join(__dirname, "./logs");

module.exports = {
  appenders: {
    ConsoleLog: {
      type: "console"
    },
    FileLog: {
      type: "file",
      filename: path.join(LOG_ROOT_DIR, "./error.log"),
      maxLogSize: 5000000,
      bakups: 10
    }
  },
  categories: {
    "default": {
      appenders: ["ConsoleLog"],
      level: "ALL"
    },
    system: {
      appenders: ["FileLog"],
      level: "ERROR"
    }
  }
};

エラーログ出力のミドルウェアを追加

// Expressサーバーパッケージを読み込み
const express = require("express");
const app = express();
const log4js = require("log4js");
//設定ファイルの読み込み、設定
const config = require('./log4js.config.js')
log4js.configure(config);
const logger = log4js.getLogger('system');

app.get("/", (request, response) => {
//ルーティングにテスト用のエラー
  throw new Error("test");
  response.end("Hello World");
});

//エラーログ出力のミドルウェアを追加
app.use((err, req, res, next) => {
    logger.error(err.message);
    next(err);
})

app.listen(3000)

アクセスログをファイルに出力する

connectLogger:アクセスログ出力用のミドルウェアです

log4js.connectLogger(logger,option)

参考URL:https://log4js-node.github.io/log4js-node/connect-logger.html

アクセスログを、日付でロールしてファイルに出力する設定

const path = require("path");
//ログファイルの出力先を環境環境変数で指定、環境変数がなければlogsフォルダ直下
const LOG_ROOT_DIR = process.env.LOG_ROOT_DIR || path.join(__dirname, "./logs");

module.exports = {
  appenders: {
    ConsoleLog: {
      type: "console"
    },
    DateRollingFileLog: {
      type: "dateFile",
      filename: path.join(LOG_ROOT_DIR, "./access.log"),
    }
  },
  categories: {
    "default": {
      appenders: ["ConsoleLog"],
      level: "ALL"
    },
    access: {
      appenders: ["ConsoleLog","DateRollingFileLog"],
      level: "INFO"
    }
  }
};

アクセスログ出力のミドルウェアを追加

// Expressサーバーパッケージを読み込み
const express = require("express");
const app = express();
const log4js = require("log4js");
const config = require('./log4js.config.js')

log4js.configure(config);
const logger = log4js.getLogger('access');
//静的ファイルの返却
app.use(express.static('public'));
//アクセスログをファイルに出力
app.use(log4js.connectLogger(logger, { level: 'auto' }));

//ルーティング
app.get("/", (request, response) => {
  response.end("Hello World");
});

//コンソールにもアクセスログ出力
app.listen(3000, () => {
  logger.info('3000ポートでサーバー起動');
});