JavaScriptのロガー「log-talk」を作った

JavaScriptにも既にいくつもロガーのライブラリがあるのですが、気に入らない点があったので自作しました。
GitHubにレポジトリを作っているので、是非使ってみてください。
npmでインストール可能です。

他のロガーの気に入らなかった点

正確な行数が表示されない

例えば、以下のようにロガーを定義して呼び出したとします。

var logger = console.log;
logger('foo');

logger('foo')の行がコンソールに出力されてほしいのですが、実際には定義した行数(1行目)が表示されています。
エラーの箇所が知りたいのに、ロガーの定義した行数が延々と表示されていては使い物になりません。

ブラウザで使えない

今やNode.jsなしにフロントエンド開発なんて考えられません。
しかし、レガシー開発ではNode.jsが使えないこともあり、ターミナルでしか使えないと何かと不便です。

また、開発環境だけではなく本番環境でも実ファイルとしてログを取りたいということもあると思います。
このときNode.jsに依存していると、ログを取るために本番環境にもNode.jsが必要になります。

サーバーにログを渡せるように設計していますが、まだ試していません。

特徴

ログレベル

各メソッドにはレベルが設定してあります。
newするときにコンストラクタにレベルを渡してやると、そのレベル以上のメソッドしか実行されなくなります。
0を指定すると、全てのメソッドが実行されません。

例えば、開発環境ではデバッグのためのログを表示したいが、本番環境ではエラーログのみ表示したい場合に役に立ちます。
詳しくは動作サンプルを参照してください。

タイムスタンプ

デフォルトでログのタイムスタンプが先頭に付与されます。

拡張

ユーザがメソッドを独自に定義することもできます。
ラベル、色、サイズが指定可能です。

ログ監視機能

正規表現に一致したログメッセージが入力された場合に、任意の処理を実行することができます。

// 実行したい処理
logger.onMatch(/message/, function(args) {
  alert('Bar');
});

ハマった点

webpackでumdライブラリ作成

自作ライブラリを公開する場合は、webpack.config.jsのoutputプロパティに以下の設定を追加する必要があります。

library: 'LogTalk',
libraryTarget: 'umd',

この状態でターミナルで実行したらwindow is not definedになりました。
ブラウザだけでなく、Nodeでも動くようにしたい場合は以下の記述が必要っぽい。

globalObject: 'typeof self !== \'undefined\' ? self : this',

何このハック感・・・。

npmでは同じバージョンで上書きができない

ビルドし忘れてリリースしちまったんで、npm unpublish ./@v1.0.2を実行して一度リリースしたバージョンを消しました。
それで修正したものを改めてnpm publish ./したらエラーになりました。
どうやら、特定のバージョンのパッケージを消すことは出来ても、書き換えは出来ないみたいです。
なるほど、理にかなってますね。