【徹底解説】Node.jsでJSONをログ出力!console.logだけじゃない、3つの方法とサンプルコード

2024-05-14

Node.jsでJSONオブジェクトの内容をログに記録する方法

console.logを使う

最も簡単な方法は、console.logを使ってJSONオブジェクトを直接出力することです。

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

console.log(obj);

このコードを実行すると、以下の出力がコンソールに表示されます。

{ name: 'Taro', age: 30, city: 'Tokyo' }

しかし、console.logで直接出力すると、JSONオブジェクトの構造が分かりにくくなってしまいます。そこで、以下のオプションを使用すると、見やすく整形して出力することができます。

  • util.inspectを使う

    utilモジュールには、オブジェクトを検査して文字列に変換するinspect関数があります。この関数を使うと、JSONオブジェクトの構造を保ちつつ、インデントや改行を挿入して出力することができます。

    const obj = {
      name: 'Taro',
      age: 30,
      city: 'Tokyo'
    };
    
    const util = require('util');
    console.log(util.inspect(obj));
    
    {
      "name": "Taro",
      "age": 30,
      "city": "Tokyo"
    }
    

ロギングライブラリを使う

より高度なログ出力を行いたい場合は、ロギングライブラリを使うと便利です。ロギングライブラリには、ログレベルの設定や、ログファイルへの出力など、様々な機能が備わっています。

代表的なロギングライブラリとして、以下のようなものがあります。

これらのライブラリは、それぞれ異なる特徴を持っているので、用途に合わせて使い分けることができます。

Node.jsでJSONオブジェクトの内容をログに記録するには、主に以下の方法があります。

それぞれの方法には、メリットとデメリットがあるので、状況に合わせて使い分けることが重要です。




console.logを使う

1 基本的な出力

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

console.log(obj);
{ name: 'Taro', age: 30, city: 'Tokyo' }

2 util.inspectを使う

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

const util = require('util');
console.log(util.inspect(obj));
{
  "name": "Taro",
  "age": 30,
  "city": "Tokyo"
}

3 JSON.stringifyを使う

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

console.log(JSON.stringify(obj, null, 2));
{
  "name": "Taro",
  "age": 30,
  "city": "Tokyo"
}

ロギングライブラリを使う

1 Winstonを使う

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  transports: [
    new winston.transports.Console()
  ]
});

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

logger.info(obj);
[Info] { name: 'Taro', age: 30, city: 'Tokyo' }

2 Bunyanを使う

const bunyan = require('bunyan');

const logger = bunyan.createLogger({
  name: 'my-app'
});

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

logger.info(obj);
{"name":"my-app","level":30,"msg":{"name":"Taro","age":30,"city":"Tokyo"}}

3 Pinoを使う

const pino = require('pino');

const logger = pino();

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

logger.info(obj);
{"level":30,"msg":{"name":"Taro","age":30,"city":"Tokyo"}}

説明

上記のコード例では、それぞれの方法の基本的な使い方を示しています。ロギングライブラリの使い方については、各ライブラリのドキュメントを参照してください。

補足

  • ログレベルの設定や、フォーマットのカスタマイズなど、より高度なログ出力を実現するには、各ライブラリの機能を活用することができます。
  • ロギングライブラリを使用する場合は、ライブラリのインストールが必要になります。
    • npm install コマンドを使ってインストールすることができます。



Node.jsでJSONオブジェクトをログに記録するその他の方法

ファイルへの出力

ログファイルを生成して、JSONオブジェクトの内容をファイルに記録することができます。これにより、過去のログを簡単に参照することができます。

const fs = require('fs');
const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

const logFile = 'app.log';

fs.appendFile(logFile, JSON.stringify(obj) + '\n', (err) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('ログをファイルに記録しました');
});

HTTPリクエストのペイロードとして送信

JSONオブジェクトをHTTPリクエストのペイロードとして送信することで、ログサーバーなどに記録することができます。

const http = require('http');

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

const options = {
  hostname: 'localhost',
  port: 3000,
  path: '/logs',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  }
};

const req = http.request(options, (res) => {
  if (res.statusCode !== 200) {
    console.error('ログの送信に失敗しました:', res.statusCode);
    return;
  }
  console.log('ログを送信しました');
});

req.on('error', (err) => {
  console.error('ログの送信に失敗しました:', err);
});

req.write(JSON.stringify(obj));
req.end();

カスタムロガーを実装

独自のロガーを実装することで、より柔軟なログ出力を実現することができます。

class MyLogger {
  constructor(options) {
    this.options = options;
  }

  log(level, message) {
    const logMessage = `[${level}] ${message}`;
    if (this.options.console) {
      console.log(logMessage);
    }
    if (this.options.file) {
      fs.appendFile(this.options.file, logMessage + '\n', (err) => {
        if (err) {
          console.error(err);
          return;
        }
      });
    }
  }
}

const logger = new MyLogger({
  console: true,
  file: 'app.log'
});

const obj = {
  name: 'Taro',
  age: 30,
  city: 'Tokyo'
};

logger.info(obj);

注意事項

上記の方法を使用する場合は、以下の点に注意する必要があります。

  • ファイルへの出力やHTTPリクエストの送信を行う場合は、セキュリティ対策を適切に行う必要があります。
  • カスタムロガーを実装する場合は、ロジックが複雑になりやすいため、十分なテストを行う必要があります。

Node.jsでJSONオブジェクトをログに記録するには、様々な方法があります。それぞれの方法には、メリットとデメリットがあるので、状況に合わせて使い分けることが重要です。


json node.js


JavaScript:JSON.stringify() メソッドで配列をJSONに変換する方法

JSON. stringify() メソッドは、JavaScript の値を JSON 文字列に変換します。JSON. stringify() メソッドは、オプションで第二引数と第三引数を指定できます。第二引数は、変換するプロパティを指定する配列です。...


Node.js 開発者必見! Git で "node_modules" フォルダを賢く管理する方法

一般的に、"node_modules" フォルダを Git リポジトリに含めるべきではありません。理由は以下の通りです。容量が大きくなる: "node_modules" フォルダは、プロジェクトで使用しているすべての Node. js パッケージのライブラリファイルを含むため、非常に大きくなります。これは、リポジトリのサイズを肥大化させ、バージョン管理や共有を難しくします。...


Webpack Dev Server で minified と uncompressed バンドルを開発・デバッグする

Webpack は、JavaScript、CSS、およびその他のファイルのモジュール化とバンドル化のための汎用的なツールです。本番環境では、通常、コードを minify することで、ファイルサイズを縮小し、読み込み速度を向上させます。一方、開発環境では、コードが読みやすく、デバッグしやすいように、uncompressed 状態のままにしておくことが望ましいです。...


Node.jsでエラーを防ぐ!未処理Promiseを検出してコードをクリーンアップ

Node. jsにおける非同期処理において、Promiseは重要な役割を果たします。しかし、Promiseを適切に処理しないと、未処理Promiseが残ってしまい、エラーや予期せぬ動作を引き起こす可能性があります。本ガイドでは、未処理Promiseを検出するための3つの主要な方法と、それぞれの利点と欠点について詳しく解説します。...