Node.js 10.x へのアップデート JSON.stringify 編

2019.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

某カフェのバックエンドは全てLambda/Node.jsで実装されています。 昨日、Node.js10.xがリリースされていたので、ランタイムを変更してみました。 この時、CloudWatch Logs(以下、CWL)に出力されるログの形式が変わってたのでシェアします。 なお、これは2019年5月15日時点の挙動であり、変更される可能性あります(てか、変更して欲しい)。

サヨナラJSON.stringify

Node.js10.xで console.log が機能強化され、自動的にフォーマットされるようになりました。 これまでは、オブジェクトの出力時、都度 JSON.stringifyを使うのが鉄板でしたが、サヨナラです!

Lambdaのサンプルイベントで以下のようなAPI Gatewayからのイベントを出力してみます。

{
  "body": "eyJ0ZXN0IjoiYm9keSJ9",
  "resource": "/{proxy+}",
  "path": "/path/to/resource",
  "httpMethod": "POST",
  "isBase64Encoded": true,
  "queryStringParameters": {
    "foo": "bar"
  },
  "pathParameters": {
    "proxy": "/path/to/resource"
  },
  "stageVariables": {
    "baz": "qux"
  },
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, sdch",
    "Accept-Language": "en-US,en;q=0.8",
    "Cache-Control": "max-age=0",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Desktop-Viewer": "true",
    "CloudFront-Is-Mobile-Viewer": "false",
    "CloudFront-Is-SmartTV-Viewer": "false",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Viewer-Country": "US",
    "Host": "1234567890.execute-api.ap-northeast-1.amazonaws.com",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Custom User Agent String",
    "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)",
    "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==",
    "X-Forwarded-For": "127.0.0.1, 127.0.0.2",
    "X-Forwarded-Port": "443",
    "X-Forwarded-Proto": "https"
  }
}

Node.js8.10の場合

console.log(event);

つらたん・・・

console.log(JSON.stringify(event, null, 2));

カラーもついて読みやすいです。 なのでこれがスタンダードでした。

Node.js10.xの場合

JSON.stringifyを使わなくても!

console.log(event);

整形されています。 でも、CWLで見ると・・・

残念すぎる(T_T

恐らくは改行の扱いが、Amazon Linux2で変わったのかと思いますが・・・。 JSON.stringify を使った場合も出力フォーマットは変わりませんでした。

console.tableを試す

ついでに、Node.js10から使える関数で console.table があるので試してみます。

    console.table({
        x: 10,
        y: 40
    });

これもちょっと微妙ですね・・・ コンソール上では見やすいですが、CWLにはマッチしない模様。

まとめ

Node.js10.xにするなら、JSON.stringify は書かなくてOK。 CWLの改善待ち!