Express.jsにはデフォルトのログ出力にmorganが組み込まれています
morganは、サーバーがリクエストを受け取った際のログを出力しますが、任意の箇所でのログ出力はできません
どのようなログ(エラーログ・アクセスログなど)を、どのタイミングで、どこに(コンソール・ファイルなど)に出力するか?
npm install log4js --save
使い方
最も基本の形
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の出力先がファイルの場合のオプションや設定
- File Appender:一定の容量で古いログを削除する
https://log4js-node.github.io/log4js-node/file.html - Date Rolling File Appender:期間(日付)で古いログを削除する
https://log4js-node.github.io/log4js-node/dateFile.html - MultiFile Appender:カテゴリーでファイルを分ける
https://log4js-node.github.io/log4js-node/multiFile.html
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ポートでサーバー起動');
});