Remixで特定パスに対するリクエストのログ出力を抑止する
ALBなどのためのhealthcheckのログが垂れ流れるのを抑止しようとしましたが、スマートには出来ずに今後再トライするためのメモです。
モチベーション
RemixでWebサイトの構築を試している中で、ALBのhealthcheckをRemixのAPIに用意した場合にGETログがCloudWatchに延々と出力されるので、そのログを抑止したいと考えました。
環境
Node.js (16.16.0)
Remix (1.6.5)
Docker, Docker Compose
AWS Application Load Balancer
Amazon CloudWatch
RemixのLoggerを探る
Remixのソースコードから探っていくとmorganが使われているようでした。
(remix-serverでセットアップした場合かな?)
packages/remix-serve/index.ts
...
import morgan from "morgan";
...
app.use(morgan("tiny"));
...
packages/remix-serve/package.json
...
"dependencies": {
"@remix-run/express": "1.6.5",
"compression": "^1.7.4",
"express": "^4.17.1",
"morgan": "^1.10.0"
},
"devDependencies": {
"@types/compression": "^1.7.0",
"@types/express": "^4.17.9",
"@types/morgan": "^1.9.2"
},
...
これをプロジェクト側からカスタマイズしたらスマートかと思うのですが、難しそうなので別の方法を探ります。
標準出力される際にフィルターする方法を探る
package.jsonの起動スクリプトにgrepを加えてみる(試しにdevに追加)
"dev": "cross-env NODE_ENV=development remix dev | grep -v 'healthcheck'"
パイプラインで「healthcheck」が含まれているものを除外しただけなのですが、簡易な確認(curlでリクエストした際のログ出力を確認)する限りはこれでも期待した動作をしました。
ただ、"dev"ではなく"start"の方に追加すると期待する動作はしませんでした。
Dockerのawslogsでフィルターする方法を探る
Dockerコンテナとしてデプロイしていたので、そこで指定しているawslogsでfilterやexcludeなどがあればいいなと思ってドキュメントをみていたのですが、それらしいものはありませんでした(たぶん)。
Amazon CloudWatchのログから不要なログを削除する方法を探る
これはあまり探ってないのですが、healthcheckのログが出力された後にAmazon CloudWatch上から削除してはどうかと思ったのですが、そのような機能はなさそうで、検索フィルタで除外するという方法となりそうでした。
npm installした後にモジュールを書き換える方法を探る
serverセットアップのmorganでskipを入れることが出来ればいいので、npm installした後に書き換えてみる。
インストール後はここにありました。
node_modules/@remix-run/serve/dist/index.js
app.use(morgan__default["default"]("tiny"));
これを以下のコマンドで置換するようにしてみます。
sed -i -e 's/("tiny")/("tiny", {skip: function (req, res) { return req.url.includes("healthcheck") }})/' <project path>/node_modules/@remix-run/serve/dist/index.js
出来上がり。
app.use(morgan__default["default"]("tiny", {skip: function (req, res) { return req.url.includes("healthcheck") }}));
これでも期待する動きをしました。
さいごに
さらっと思いついたところを確認してみたところでした。ログが垂れ流れていたとしても実害は少ないのですが、気にはなる部分なので手間が少なく対応出来るといいなと思います。