こんにちは。小学生向けのニュースサイト、こどもニュースをつくっています。
開発中、DevTools を開いた状態でページを見ていると、サーバのログに知らないパスへの 404 が出続けました。
GET /.well-known/appspecific/com.chrome.devtools.json 404
自分が書いた覚えのないパスです。原因と対処を書きます。
何のリクエストか
Chrome DevTools が、開いているページに対して自動的に取りに行くファイルです。ワークスペースの自動設定などに使われるもので、無ければ無いで DevTools は普通に動きます。
つまり、実害はありません。ただ、開発サーバのログに 404 が並び続けます。
自分のアプリのログを読んでいるときに、無関係な 404 が挟まるのは地味に邪魔でした。とくに、本当の 404 を探しているときに紛れます。
対処
空の JSON を返すルートを 1 つ置きました。
export const dynamic = 'force-static';
export function GET() {
return Response.json({});
}
これだけです。ファイルの場所は、リクエストされるパスに合わせます。
force-static を付けているのは、このサイトが静的書き出しだからです。ビルド時に静的なファイルとして出力されるので、本番でも同じレスポンスが返ります。動的なルートとして残ると、静的書き出しでエラーになります。
「無視する」より「返す」ほうが安い
対処の候補はいくつかありました。
- サーバのログでこのパスを除外する
- ミドルウェアで早期に返す
- ルートを置いて空の JSON を返す
ログの除外は、ログの設定を触ることになります。開発サーバのログは Next.js が出しているので、そこに手を入れるのは大げさです。
ミドルウェアも、この 1 件のために置くには重いです。
結局、4 行のファイルを 1 つ置くのがいちばん安く済みました。「無視する仕組み」を作るより、「期待されているものを返す」ほうが単純なことがあります。
似たものが他にもある
同じ性質のリクエストは他にもあります。
-
/favicon.ico(アイコンを設定していないとき) /apple-touch-icon.png/robots.txt- ブラウザ拡張が取りに行くファイル
いずれも、無ければ 404 が出ます。実害は無いものが多いのですが、ログが読みにくくなります。
判断としては、次のように分けています。
- サイトとして返すべきもの(favicon、robots.txt)はちゃんと作る
- ツールが勝手に取りに行くもので、空でよいものは空を返す
- どこから来ているか分からないものは、まず調べる
3 つ目が大事で、知らないパスへのアクセスを全部黙らせると、本当に困る兆候まで見えなくなります。まず「これは何のリクエストか」を調べて、それから黙らせります。順序を逆にしないようにしています。
開発時のノイズは減らす価値がある
こういう対処は、機能としては何も生みません。それでも手を入れる価値はあると思っています。
ログにノイズが混ざっていると、ログを読まなくなります。読まなくなると、本当の異常を見逃します。「いつも出ているやつ」が増えるほど、ログの価値が下がっていきます。
同じ理由で、このプロジェクトでは E2E で使う静的ファイル配信のリクエストログも抑止しています。ビルドのログは残して、1 リクエストごとのログだけを止める、という設定です。
出力するかどうかは、その情報を実際に読むかどうかで決めます。読まないものは出さないほうが、読むものが目立ちます。
まとめ
- Chrome DevTools は開いているページに対して特定のパスを取りに行く。無ければ 404 が出続ける
- 実害は無いが、開発サーバのログが読みにくくなる
- 空の JSON を返すルートを 1 つ置くのがいちばん安い。ログの除外設定より単純
- 静的書き出しのサイトでは、静的なルートとして出力させる
- 知らないパスをまず調べる。全部黙らせると本当の兆候まで見えなくなる
- 読まないログは出さない。ノイズが増えるとログ自体を読まなくなる