📝

簡易なログライブラリを作った話

2021/07/04に公開

どうも、@armorik83です。担当していた案件が一段落したので、そこで使ってたライブラリを切り出してOSS化させた時の話です。

cw-log

まずは宣伝させてください。

モチベーション

console.log()がソースに残り続けるのは良くない、かと言ってログを追いたい時に書いて、終わったら消す…の繰り返しは面倒だし、消し忘れがあるとコミットも汚れる。

console.log()の有効無効を制御するラップやフックは割と誰でも通る道かと思いますが、ラップだとコンソールに常にラップメソッドの行番号が表示されて全く嬉しくないので、この点も考慮しました。

先頭2文字が名前空間なのObjective-C引きずっててアレですが、まあlogは取れるはず無いよなーという事情です。

使い方

$npm install cw-log --save
var log = require('cw-log').logger(6);

まず、loggerインスタンスを作成します。<script>ローディングの場合は、/lib/log.jsを使って、

html
<script src="/path/to/log.js"></script>
js
var log = cwlog.logger(6);

こうなります。

API

  • trace(...args)
  • debug(...args)
  • info(...args)
  • warn(...args)
  • error(...args)
  • fatal(...args)

logが持つメソッド群です。console.log()系と同じく可変引数です。

  • t(): string

タイムスタンプもあります。単なるnew Date().toISOString()のエイリアスですが、使ってて欲しくなったので用意しました。trace(log.t(), __filename, bar)のように第一引数に与える想定なので初期状態でセパレータが入っていますが、そこは適宜いい感じにしてください。

ログレベル

  • 0: OFF
  • 1: FATAL
  • 2: ERROR
  • 3: WARN
  • 4: INFO
  • 5: DEBUG
  • 6: TRACE

cw-logにはApache Log4jの影響を受けたレベルを採用しています。.logger(6)の数字を下げると、そのレベル以下の内容しか出力されません。logger(0)だとcw-logは一切のログを吐きません。console.log()は変更してないので、そのまま使えます。

出力時は常に「呼んだところの」行番号が表示されて、常にラッパーの行番号を返すような萎えるログではありません。

気軽にOn/Offできて行番号も正しく表示される簡易ロガー、ぜひお試しあれ。

OSS化とnpm publish

何かしらを公開することにはずっと関心があって、でも一度公開すると破壊的変更への考慮とか、維持が大変だよなーとかちょっと思っていました。ただ最近、界隈のOSS職人の活躍っぷりに少なからず感化されているのと、正味自分が便利に使えればそれでいいの延長だと開き直ったので、方針を変えて積極的に載せていくことにしました。(頻繁に破壊的変更を入れるだとか、品質を保証しないと言ってるわけではないです)

いきなりヘヴィーなものも大変なので、今回ログのみのライブラリは軽量で題材に最適でした。

参考にしたもの

有名どころ(Angularとか)は逆にデカすぎて今回の参考にはなりませんでした。

得たもの

  • npm publishチョーカンタン
  • Travis CIチョーカンタン(ほんとすぐ動き出してびっくりした)
  • npm publishしたのにgit pushしてなくて「あっ」てなるやつを経験
  • 別プロジェクトでnpm i 自分のやつ --saveできる楽しさ:v:

楽しくやってるので今後も続けます。

反省点

次に活かしたいのは/src/libの扱い。GitHubにはTypeScriptだけ載せて、npmにはbuildだけ載せたいという悩みがこの時点では解決できず、両方載ってます。

なんかドンピシャな記事がきたので、次はこれ試そうと思ってます。

以上です。

Discussion