Deno Deployで使えるログモジュールを作った
以前、Denoのログを整形する記事を書きました。
こちらでは、std/logを使用し、コンソールとファイルへのログ出力を行っていました。
ただ、最近はDeno Deployを触ることが多くなり、ファイル出力系の機能があるモジュールが足枷になることが増えてきました。
Deno Deployには(少なくとも本記事執筆時点では)writeFile系のAPIが存在しないため、型エラーが起きて使用できないのです。
類似のモジュールはいくつか存在しますが、多くがstd/logを内部的に利用していたり、ファイル出力機能を持っていたりするため、同様の問題が見られました。
ということで、Deno Deployと競合しないログモジュールを作りました。
時刻とレベルを表示する、Time-Level-Logということでtl_log
です。
こんな感じに出力されます。
様々な型での出力例
機能
std/logなど既存のものに対する差別点は以下のとおりです。
- ファイル系の機能を持っていないため、ローカルでもDeno Deployでも使えます。
- 引数を透過的に
console
メソッドに渡します。- このため、文字列以外でも、複数の値でも出力できます。
- 値の色づけや整形はDenoデフォルトのものが使用されます。
- ログレベルを尊重します。
- 例えば本ライブラリの
log.info
を使うとconsole.info
が、log.warn
を使うとconsole.warn
が、それぞれ内部的に使用されます。 - このため、
debug
とinfo
は標準出力に、warn
とerror
は標準エラー出力に書き出されます。 - Deno DeployのWeb UI上のログレベルとも対応します。
- 例えば本ライブラリの
- ログレベルを制限できます。
- 「ローカル環境では
debug
ログを出し、本番環境では出さない」といったことが可能です。
- 「ローカル環境では
- ログレベルを記号で表示します。
- このため、必要な情報を出しつつ、表示をシンプルにできます。
- これはlog_symbolsを参考にしました。
- 文字で出力する設定も可能です。
- ログ毎に空行を挟む機能があります。
- 時刻表示は自由にフォーマットできます。
- Pteraを使用しています。
つかいかた
doc.deno.landにてドキュメントを公開中です。
なお、「doc.deno.landとは?」に関してはこちらの記事で紹介しているので御覧ください。
使用例
リポジトリにexampleファイルを載せています。
Deno CLIで使う
リポジトリをクローンしてexamples/console.ts
を実行してみてください。
…と言っても良いのですが、Denoはオンラインのファイルを直接実行できるので、以下のコマンドを叩けば簡単に出力を確認できます。
deno run https://deno.land/x/tl_log/examples/console.ts
本記事のはじめの方に載せた画像と同じようなログを見られるはずです。
Deno Deployで使う
本ライブラリが強く意識しているポイントです。
こちらもexamples/server.ts
を用意しています。
Deno Deploy Beta 2 APIにより、以下のコマンドでサーバー起動が可能です。
deno run --allow-env --allow-net https://deno.land/x/tl_log/examples/server.ts
Deno Deploy Beta 2に関しては以下の記事で解説しています。
もちろん、従来どおりdeployctl
も使えます。
deployctl run --libs="" https://deno.land/x/tl_log/examples/server.ts
サーバー起動後にhttp://localhost:8080/[適当なpath]
にアクセスするとログが流れます。
また、このファイルをそのまま本番のDeno Deployで使用することも可能です[1]。
ログレベルの制限をかけているので、ローカルと本番とでの出力結果の変化を見られると思います。
ちなみに、Deno DeployのWeb UIのログは 新しいものが上に来る ことはご留意ください。
なお、この画像は本ライブラリの開発中のものなので、現行版とは表示が異なります。
おわりに
上記のツイートにはDeno開発チームの中の人からメンションをもらったので、Web UIの表示も更新されるのかもしれません。
今回作成したリポジトリはこちら。Starしていただけると嬉しいです。
-
リポジトリ連携はできないが、ファイルURLは指定できるはず ↩︎
Discussion