nest.jsの起動時のログを止める
tl;dr
- 一旦LogLevelの設定で
log
をなくす - 起動後Loggerの設定を上書きする
きっかけ
最近nest.jsを使っていて、serverless環境で動かす時にgoのechoだとできたんだけど、起動時のログ出るのなんとか抑制できないかなーと思って結構無理やりっぽくなったので誰かいい方法知ってたら教えてほしい
やりたいこと
- 起動時の初期化ログの抑制
- ただしerrorやwarnは出したい
- 開発環境であればログは全部出す
実現方法
nestjsの型定義などを見てみたが、どうもそういうオプションはなさそうだった。
nestのプロジェクトを作成するとできるmain.ts
に以下の変更を加える
const productionLoggerLevel = ['error', 'warn', 'log'] as LogLevel[] async function bootstrap() { const isProd = process.env.NODE_ENV === 'production' const app = await NestFactory.create( AppModule, { logger: isProd ? ['error', 'warn'] : undefined, } ) const port = process.env['PORT'] ?? 3000 await app.listen(+port).then(() => { Logger.debug(`Server listen port ${port}`) isProd && Logger.overrideLogger(productionLoggerLevel) }) }
ここで重要なのはNestFactory.create
でproduction
環境であれば['error', 'warn']
だけをloggerに設定していて、listen
のcallback内でLogger.overrideLogger(productionLoggerLevel)
で再度上書きしている所
まとめ
nest.jsの初期化の処理を追っているとcreate
の時にLoggerの設定を行っていてfalse
を渡すとoverrideLogger
でLogger instanceをundefinedで上書きしているけど、LogLevelを設定するだけであればLoggerのインスタンスは上書きされない事がわかったので、一旦log
を抜いたLogLevelを設定して、再度log
が出力される設定で設定し直している
最近一個のサーバーでずっと動かしてるというより、コンテナとかでポンポン作るので起動時のログを素直に抑制できるオプションとか入れてくれないかな…
mi band4を買いました
母があまりにも通知に気づかないのと、寝てない自慢をするので睡眠トラッカーが欲しくmi band4を購入しました
ただいきなり渡しても使いこなせないだろうと言うことで使い方を学ぶために数日FitbitとMi Band 4を両手に装備した生活をします
tl;dr
- やっぱフルカラー綺麗
- 画面見たら自動でONになる期間を設定できる
- bluetooth5の同期が超早い(fitbitとの比較
- バッテリー充電取り外すのは死ぬほど面倒だが、fitbitと違い確実に充電できてるのはいいところ
- 一度100%まで充電すると、画面明るさ3で2日で14%くらいの消費だったので2週間くらい充電しなくて良さそう
- アカウントが削除できない
- アカウントを削除するためのログインが押せない*1
以下、感想というかツイートです
親に付けさせる様のmi band4来たので3日間fitbitとmiband両方つけますw
— ゆず🧀 (@yuzu_441) 2020年3月4日
Fitbitより設定が細やか!!
— ゆず🧀 (@yuzu_441) 2020年3月4日
これonにするとバッテリーの消費量上がるけどいい?みたいな感じで初期全部offなのいい
— ゆず🧀 (@yuzu_441) 2020年3月4日
MiFitヘルスケアに対応してる
— ゆず🧀 (@yuzu_441) 2020年3月4日
充電のためにバンドから取り外したんだけど硬すぎて飛んで行ったww
— ゆず🧀 (@yuzu_441) 2020年3月4日
これひっぱり過ぎるとバンド千切れそうだし、充電はfitbitのが良さげ
ただfitbitの充電たまに失敗するからそれに比べると確実に充電できる良さはある
— ゆず🧀 (@yuzu_441) 2020年3月4日
中々に謎のフェイスだけど、種類が多いのはいいこと pic.twitter.com/TdPuW3xK55
— ゆず🧀 (@yuzu_441) 2020年3月4日
サードパーティのあれなアプリ使うとマリオとかにできるとかなんとか
— ゆず🧀 (@yuzu_441) 2020年3月4日
これfitbitみたく端末側で一時的に通知オフにできるんだろうか?充電中操作受付なさげなので、端末のbt切るか
— ゆず🧀 (@yuzu_441) 2020年3月4日
この設定いいな pic.twitter.com/smWxl0EXMg
— ゆず🧀 (@yuzu_441) 2020年3月4日
設定とか眺めてるとfitbitより安いのになんか色々できて楽しそう…w
— ゆず🧀 (@yuzu_441) 2020年3月4日
これどうなったら充電完了なんだ
— ゆず🧀 (@yuzu_441) 2020年3月4日
充電完了したら「完全に充電されました」って出てきた
— ゆず🧀 (@yuzu_441) 2020年3月4日
明るさ変えれるだ
— ゆず🧀 (@yuzu_441) 2020年3月4日
これGDPR対策なのだろうか pic.twitter.com/8mEWzT5ot2
— ゆず🧀 (@yuzu_441) 2020年3月4日
BT5での同期めっちゃはええ
— ゆず🧀 (@yuzu_441) 2020年3月4日
明るさ設定できるのはいいけど昼間だと明るさ2で見づらいので3にするか
— ゆず🧀 (@yuzu_441) 2020年3月5日
左手にfitbit、右手にmi band4付けて寝てみた結果、30分くらい睡眠時間違うけど、どっちが正しいのかわからん
— ゆず🧀 (@yuzu_441) 2020年3月5日
心拍とかオンにして1日過ごしたけど7%くらいしか減ってないな
— ゆず🧀 (@yuzu_441) 2020年3月5日
は?Mi Fitのアカウント消せないんだけど
— ゆず🧀 (@yuzu_441) 2020年3月6日
サインインがどうしても押せない pic.twitter.com/4sRdbXRbLu
— ゆず🧀 (@yuzu_441) 2020年3月6日
*1:最後のツイート参照
GoogleFormがsubmitされた時にgasからメールを投げる
会社のwebサイトに導入したGoogle Formがsubmitされた時にG Suiteで用意したメーリングリスト(グループ)にメールを送りたかっただけなのに
信じられないくらいハマって時間かかったので、誰かが同じような所でハマった時に助けになればと思いメモ
ハマった点
appscript.jsonに使うものは手書きしないといけない
appscript.jsonというマニフェストに、使用するものはoauthScopes
に手書きしないといけない
コード的に使用しているものがうまく認識されれば勝手に入るらしいけど、関数の引数で渡ってくるeventとかでformとか判断するのは無理そうだった
マニフェストに書いても有効になっていない
例えばGoogle Formであればhttps://www.googleapis.com/auth/forms
というURLを設定するが、スクリプトエディタの画面で実行ボタンを押した時に初めて出る認証のダイアログで認証が完了して初めて有効になる
ちなみにフォームから呼ばれた時等のイベント発火では当然ながらダイアログは出ない
submit関数2つある
submitが2つあるらしい
Google Formのものではなく間違えてSpreadSheetへのアクセス権が設定されていてもsubmitのタイミングで呼び出せてしまって、以下のサンプルコードでformの値を取得するために使われているgetItemResponses
関数がundefined
となりまともに動作しない
更に自分の環境が悪いのかgetItemReponses
がundefined
だというエラーが自分の環境だと表示されず*1
aliasに設定してないと送信できない
これはやらないとできないと書いてる記事を見て、やってない場合にできないことを体力が削られすぎて確認まではしてない。とりあえず自分は設定したのでもしメール送れなかったら確認してもいいかも
サンプルコード
以下設定値とサンプルコード
{ "timeZone": "Asia/Tokyo", "oauthScopes": ["https://www.googleapis.com/auth/script.send_mail", "https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/forms" ], "dependencies": { }, "exceptionLogging": "STACKDRIVER" }
"use strict"; function myFunction(e) { var itemResponses = e.response.getItemResponses(); var msg = itemResponses.map(function (res) { return res.getItem().getTitle() + ":\n" + res.getResponse(); }).join('\n\n'); var address = ''; var options = { noReply: true, from: address }; GmailApp.sendEmail(address, 'HPお問い合わせ', msg, options); console.log('done'); }
最後に
参考にさせていただいた記事のおかげでとりあえず動くものはできました。ありがとうございます。
*1:undefinedを関数としてコールしてんだからエラー出せよとすごい思う