デバッグ出力のフィルタリング

大量のデバッグ出力を減らして、必要な情報だけ見たいといったときに、いつもやっていたのが

  • デバッグレベルを設定して、指定したレベル以上なら表示する
  • (特定の関数を呼ぶなどして)トリガ条件を設定し、そこから指定個数だけ表示する

ということをしていたのだけど、前者は切り替えるのが面倒だし、見たいときにもOFFになっていることがあった。後者はトリガ条件を甘くすると不要なものまで表示され、厳しくするとトリガに失敗することがあった。


ファイルに落としてあとで見ればいいという考え方もあるのだが、大量のデバッグログをスクロールさせるのは面倒だし、大量に出力すると動作が変わったり死んだりすることもある(デバイスドライバとか)。
なんとなく動いていることが知りたいけど大量に出力されるのがいやだ、というのができないかなということで、一定時間period_ms以内には先頭のlead_count個だけ表示するデバッグ出力クラスを書いてみた。

class DebugOutput {
  var _period_ms:Number;
  var _lead_count:Number;
  var _timestamp:Number;
  var _current_count:Number;

  function DebugOutput(period_ms:Number, lead_count:Number) {
    _period_ms = period_ms;
    _lead_count = lead_count;
    _timestamp = getTimer();
    _current_count = 0;
  }

  function Output(msg:String) {
    if (_period_ms > 0 && _lead_count > 0 ) {
      var now:Number = getTimer();
      var past:Number = now - _timestamp;
      if (past <= _period_ms) {
        if (_current_count >= _lead_count) {
          return;
        }
      } else {
        _timestamp = now;
        _current_count = 0;
      }
      ++_current_count;
    }

    trace(msg);
  }
}

これはActionScript2.0なのだけど、getTimer()をKeQuerySystemTime()とかにしてドライバで使う予定。
それにしてもメンバ変数の名前にはいつも悩む。
「カウント設定値を保持するメンバ」と「現在のカウンタを保持するメンバ」ってどっちもcountか?とか。