[NodeJS] log4js でログをいい感じに出力する方法

[NodeJS] log4js でログをいい感じに出力する方法

log4js とは

log4js-node/log4js-node: A port of log4js to node.js

log4js というログ出力用のフレームワークがあります。これを使うとNodeJS上からログをいい感じに出力できるようになります。

console.log() を使うよりも見やすくコンソールに出力できるほか、以下のような機能をサポートしています。

  • stdout, stderr への色付き出力
  • ログローテーション
  • Expressサーバーのロガー
  • ログメッセージのレイアウト
  • ログカテゴリやログレベルのカスタマイズ

log4js の使い方

インストール

$ npm install log4js

npm でインストールします。

使い方

まず、ロガーの設定を行います。最初はコンソールにログを吐く設定を行ってみます。

log-config.json という名前で設定用のJSONファイルを作成します。

{
  "appenders": {
    "console": {
      "type": "console",
      "level": "all"
    }
  },
  "categories": {
    "default": {
      "appenders": [
        "console"
      ],
      "level": "all"
    }
  }
}

index.js ファイルを作成し、以下のようにしてみます。

const Log4js = require("log4js");
Log4js.configure("log-config.json");

const logger = Log4js.getLogger("system");
logger.info("infoです。。。");
logger.error("エラーです。。。");

やっていることは設定ファイルを読み込み、getLogger() でロガーを作成しています。

あとは作成したロガーでログレベル(info や error, warn など)を指定してログを出力できます。

[2020-01-22T22:58:19.426] [INFO] system - infoです。。。
[2020-01-22T22:58:19.430] [ERROR] system - エラーです。。。

コンソールにはいい感じに色付きで出てきます。

用語の意味

log4js-node by log4js-node

用語の意味が上のページに載っています。

Level

レベルはログの重要度または優先度を意味します。カテゴリやAppenderがログのレベルを判定して、処理されるかどうかを決めます。

  • all
  • trace
  • debug
  • info
  • warn
  • error
  • fatal
  • off

ログレベルは順番に並べると上のようになります。設定したレベルより下にあるレベルのログはすべて出力されます。

“all” を設定するとすべてのレベルのログが出力されます。”error” を設定すると “error”, “fatal” だけが出力されます。

Appenders

ログの出力を担当します。ログの出力先や出力するログのレベルを変更したりできます。

Category

Appender をグループ化します。これはモジュール単位などで分けて使ったりします。(例:「auth」「payment」「http」)

カテゴリで設定されたすべてのAppenderにログが送られます。

ファイルに出力する方法

例えば、すべてのログをコンソールに出しつつ、同時にファイルにもログを出力できるようにします。

{
  "appenders": {
    "console": {
      "type": "console"
    },
    "system": {
      "type": "dateFile",
      "filename": "log/system.log",
      "pattern": "-yyyy-MM-dd"
    }
  },
  "categories": {
    "default": {
      "appenders": [
        "console",
        "system"
      ],
      "level": "all"
    }
  }
}

別の出力方法を設定する場合には、別の appender を設定します。これをデフォルトのカテゴリに入れておけば、いい感じに処理されます。

pattern でファイル名を日付にして適宜バックアップしてくれます。

index.js で出力してみます。

const Log4js = require("log4js");
Log4js.configure("log-config.json");

const logger = Log4js.getLogger("system");
logger.info("infoです。。。");
logger.error("エラーです。。。");

コンソールは先ほどと変わらず両方出力されます。同時にコンソールに出力された内容と同様に以下の内容が /log/system.log ファイルに出力されます。

[2020-01-23T00:04:52.991] [INFO] system - infoです。。。
[2020-01-23T00:04:52.995] [ERROR] system - エラーです。。。

複数のイベントで出力を使い分ける

ファイルに出力するときに、エラーのログと通常のログを分けて出力したい場合は、カテゴリで分けるといい感じです。

{
  "appenders": {
    "console": {
      "type": "console"
    },
    "system": {
      "type": "dateFile",
      "filename": "log/system.log",
      "pattern": "-yyyy-MM-dd"
    },
    "error": {
      "type": "dateFile",
      "filename": "log/error.log",
      "pattern": "-yyyy-MM-dd"
    }
  },
  "categories": {
    "default": {
      "appenders": [
        "console",
        "system"
      ],
      "level": "all"
    },
    "error": {
      "appenders": [
        "console",
        "error"
      ],
      "level": "warn"
    }
  }
}

カテゴリでエラー出力用のイベントを作成し、”appender” でエラー出力用の設定を指定すれば、別のファイルに出力できます。

const Log4js = require("log4js");
Log4js.configure("log-config.json");

const logger = Log4js.getLogger("system");
logger.info("infoです。。。");
logger.error("エラーです。。。");

// エラー用
const errorLogger = Log4js.getLogger("error");
errorLogger.error("error.log に出力されます。");

getLogger("xxxx") でカテゴリ名を指定すると、対応するロガーを作成できます。カテゴリが存在しないときはデフォルトのカテゴリが選ばれます。

別のインターフェースでロガーが使えて便利です。

実行するとコンソール出力は以下のようになります。コンソール出力はどちらのカテゴリにも含んでいるのですべて出ます。

[2020-01-24T00:15:58.473] [INFO] system - infoです。。。
[2020-01-24T00:15:58.476] [ERROR] system - エラーです。。。
[2020-01-24T00:15:58.477] [ERROR] error - error.log に出力されます。

/log/system.log には system の行だけが、/log/error.log には error の行だけが出力されています。

以上。

Javascriptカテゴリの最新記事