console.logでネストしたオブジェクトが[Object]で省略される、depth: nullで直る

  • Node.js
  • JavaScript

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

深くネストしたオブジェクトを console.log() すると、途中から [Object] とか ... に丸められて中身が見えなくなることがある。原因と直し方をメモっとく。

何が起きてるか

console.log() は内部で util.inspect() を使ってて、デフォルトの depth オプションが 2。なので3階層より深いプロパティは表示されずに省略される。バグじゃなくて仕様。

直し方

util.inspect を直接使って depth: null を渡せば無制限に展開される。

import util from 'util';
console.log(
util.inspect(obj, {
depth: null,
colors: true,
})
);

console.dir() でも同じオプションが使える。こっちの方が短く書ける。

console.dir(obj, {
depth: null,
colors: true,
});

毎回オプション渡すのが面倒なら、アプリ起動時にグローバル設定を変えてしまう手もある。

util.inspect.defaultOptions.depth = null;
util.inspect.defaultOptions.colors = true;

JSON.stringifyという選択肢

循環参照がなければ JSON.stringify(obj, null, 2) でも展開できる。ただし循環参照があるとそのままエラーになるし、関数やPrototype情報は出力されない。用途が違うので使い分け。

colors: trueの注意

colors: true はターミナルでの色付き表示が前提のオプション。ブラウザのコンソールとか、CloudWatch Logsみたいなログ収集基盤に出す場合は、ANSIエスケープシーケンスがそのまま文字列として混ざって逆に読みにくくなる。出力先がターミナルじゃないなら colors: false(またはオプション自体省略)にしておいた方がいい。

結論

import util from 'util';
console.log(util.inspect(obj, { depth: null, colors: true }));

これが一番汎用的。ただしログ収集基盤に流す場合は colors を外すこと。