1. 概要
前ページで、サービス化していますが、その過程で出力しているログが、日時等がついていないので、いささか不満です。
ログを出力するパッケージを使います。
2. インストール
プロジェクトの管理者権限で、プロジェクトのドキュメントルートで。
npm install winston
3. 設定
「server.js」を編集します。
インポートあたりの直後に、下記の行を加えます。
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(({ timestamp, level, message }) => `[${timestamp}] ${level}: ${message}`)
),
transports: [
new winston.transports.File({ filename: '/var/log/myapp.log' }),
new winston.transports.Console()
]
});
logger.info('Server started');
以降、ログを。
logger.info();
の形式で出力すれば、「new winston.transports.File()」で指定したファイルへ出力するようになります。
4. 日時書式
日時書式が、デフォルトで。
[2025-11-21T05:59:59.717Z] info
てなことになるので、書式を変えたい。
変えるには。
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf } = format;
const myFormat = printf(({ level, message, timestamp }) => {
return `${timestamp} [${level}]: ${message}`;
});
const logger = createLogger({
level: 'info',
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }),
myFormat
),
transports: [
new transports.File({ filename: '/path/to/myapp.log' }),
new transports.Console()
],
exitOnError: false
});
これで、「format」で指定した書式で出力されます。
2025-11-21 15:08:11.155 [info]
「level: 'info'」に関しては、次項で。
5. レベル
ログのレベルには、下記のものがあるようです。
const logger = createLogger({
level: 'info',
...
});
logger.error('致命的エラー');
logger.warn('注意が必要な警告');
logger.info('お知らせ');
logger.http('HTTP 関連');
logger.verbose('詳細情報');
logger.debug('デバッグ用情報');
logger.silly('さらに細かい情報');
上記は、重大度の高いものから順番にならべており。
「level: 'info'」の記述は、「info」以上のものを出力するということになっているようです。
つまりすべてを出力するには「level: 'silly'」と記述します。
6. ローテーション
「winston」には、「winston-daily-rotate-file」というローテーションのパッケージもあるのですが。
これは。
myapp-2025-11-21.log
てな感じで、全部に「YYYY-MM-DD」がついちゃう。
わたしは、日替わりで、新しい順に「myapp.log」「myapp.log.0」「myapp.log.1」「myapp.log.2」... となる形式がいいのだ。
そうするには、ローテーションは「Linux」の「logrotate」に任せる方がいいようです。
sudo vi /etc/logrotate.d/myapp
下記のように記述します。
/path/to/myapp.log {
daily
rotate 30
missingok
notifempty
copytruncate
su hogehoge hogehoge
}
これで、日替わりで、30日分保持しつつ、ローテーションします。
「su hogehoge hogehoge」の箇所は、ログディレクトリの所有権が、「root」でない場合、所有者のグループ・ユーザを記述します。
バックアップログを圧縮する場合は、「{」と「}」の間に、下記の行を記述します。
compress
delaycompress
試験してみるには。
sudo logrotate -f /etc/logrotate.d/myapp
とすれば、強制的にローテーションが発生します。
7. 参考サイト
本ページは、「ChatGPT」軍曹を参考にさせていただきました。