(Node.js) winstonモジュール、winston-daily-rotate-fileモジュールを理解する

# はじめに
node.jsのコードの中でwinstonモジュール、winston-daily-rotate-fileモジュールを使用する機会があったので、どのようなモジュールであるのか簡単にまとめたいと思います。

# winstonモジュールとは
Node.jsでよく使われるロギングライブラリで、アプリケーション内のログを効率的かつ柔軟に管理するためのツールです。アプリケーションの状態を追跡したり、エラーメッセージを記録したり、パフォーマンスをモニタリングするために使用されます。

## winston の主な特徴
- 複数のトランスポートをサポート：ログをファイル、コンソール、HTTP、あるいはリモートサーバーなど様々な場所に出力できます。
- ログレベルの設定：ログの重要度に応じて、出力するメッセージをフィルタリングできます（例：info, warn, error）。
- カスタマイズ可能なフォーマット：ログの出力フォーマットを自由に設定でき、タイムスタンプやカラーリングなどのカスタマイズも可能です。
- 非同期での動作：ロギングが非同期で行われるため、パフォーマンスに負荷をかけにくい設計です。

# サンプルコード
```javascript:winston.js
const winston = require("winston");
const DailyRotateFile = require("winston-daily-rotate-file");
const logDir = "logDir";

const logger = winston.createLogger({
  level: "silly",
  format: winston.format.simple(),
  transports: [
    new winston.transports.Console(),
    new DailyRotateFile({
      filename: `${logDir}/produce-clearmap-%DATE%.log`,
      datePattern: "YYYY-MM-DD",
      maxSize: "20m",
      maxFiles: "14d",
    }),
  ],
});

const iso = () => {
  return new Date().toISOString();
};

logger.info(`${iso()}: clearmap production started.`);
logger.error("An error occurred");


```

## コードの解説
・const winston = require("winston");
winston は、Node.js 用のロギングライブラリで、さまざまな出力先（コンソールやファイルなど）にログを送信できます。

・const DailyRotateFile = require("winston-daily-rotate-file");
DailyRotateFile は、ファイルを日付ごとにローテーションさせるためのトランスポート（出力先）モジュールです。

・const logger = winston.createLogger({
winston.createLogger() によって logger オブジェクトを作成します。このオブジェクトは、ログメッセージを記録するための中心的な存在です。

・ level: "silly",
ログレベル (level) は "silly" です。winston のログレベルは、error から silly まであり、silly は最も詳細なログレベルです。
ログレベルの階層: error -> warn -> info -> http -> verbose -> debug -> silly

・format: winston.format.simple(),
シンプルなテキスト形式でログが出力されます。

・new winston.transports.Console(),
ログをコンソールに出力します。

・new DailyRotateFile({
  filename: `${logDir}/produce-clearmap-%DATE%.log`, // ログファイルのパス
  datePattern: "YYYY-MM-DD", // ローテーションの日付フォーマット
  maxSize: "20m", // ログファイルの最大サイズ、最大20MB、それ以上は新しいファイルを作成
  maxFiles: "14d", // 過去14日分のログを保持、それ以前は削除
  }),
%DATE%がプレースホルダーであり、datePattern: "YYYY-MM-DD"が適用されます。


・const iso = () => {
  return new Date().toISOString();
};
この関数は、現在の日時を ISO 8601 形式で取得するためのものです。例えば、2024-09-24T12:34:56.789Z のような形式で返されます。
ログに時間を記録する際に使われ、システムの動作時間などの管理に役立ちます。


・logger.info(`${iso()}: clearmap production started.`);
logger.info() は、レベル info のログを出力します。このログは、タイムスタンプ付きで clearmap production started というメッセージを記録します。


・logger.error("An error occurred");
logger.error() は、レベル error のログを出力し、ここでは An error occurred というエラーメッセージを記録します。


# 実行結果

![スクリーンショット 2024-09-24 18.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/1cfe4fc3-308f-8eb3-3991-b0a14349f6d2.png)


# 疑問点
levelでsillyと設定しているのに、
logger.info(`${iso()}: clearmap production started.`);
logger.error("An error occurred");
とすると、設定したsillyは意味ないのではという疑問がありました。

しかし、chatGPTに聞いたところ、以下の回答がありました。
「level を silly に設定することは、ロガーが最も詳細なレベルのログも含めてすべてのログを記録することを意味します。したがって、info や error のログも出力されるため、silly の設定は意味があります。もし level を info に設定していた場合、silly や debug レベルのログは出力されなくなりますが、info や error は出力されます。」
つまり、最初に設定したsillyを基準に出力されるログが決まるようです。


# winston.configure()について
winston.configure()はグローバルロガーを設定するためのメソッドで、アプリケーション全体で一貫したロギングを行うには有効ですが、個別のロガーを作成して管理する場合にはwinston.createLogger()の方が柔軟です。

### 使い分けのポイント

•	winston.configure()
アプリケーション全体のグローバルロガーの設定を変更・更新するためのメソッドです。コード全体でどこでも同じロガーを使う場合に便利ですが、他のモジュールやライブラリが同じグローバルロガーに影響を受ける可能性があります。

 •	winston.createLogger()
新たなロガーインスタンスを作成します。これにより、個別のロガーを作成し、それぞれ異なる設定（レベル、フォーマット、トランスポート）を適用できます。アプリケーションの特定の部分で異なるロギング設定をしたい場合に非常に便利です。

# まとめ
node.jsのwinstonモジュール、winston-daily-rotate-fileモジュールの使用方法についてまとめました。

# Reference

https://www.npmjs.com/package/winston

https://www.npmjs.com/package/winston-daily-rotate-file