JavaScript - node + express(MQTT・定時処理)- ログ


 クラウディア


1. 概要
2. インストール
3. 実装
4. 日時書式
5. レベル
6. ローテーション
7. 参考サイト

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」軍曹を参考にさせていただきました。

EaseUS
AbemaTV 無料体験
サウンドハウス