開発者ブログ
リファレンス(仕様詳細) » ロガーの使用方法と設定

ロガーの使用方法と設定

Last modified by fukudayasuo on 2014/08/12, 09:31

ロガーの使用方法

ロガーの使用方法には、h5.log.createLogger()を使って作成したロガーを使用する方法と、コントローラまたはロジックの持つロガーを使用する方法とがあります。createLoggerの引数にはログカテゴリを指定します。ログカテゴリはログの設定で出力されるログにフィルタ(後述)を記述するときに使用します。コントローラまたはロジックの持つロガーのログカテゴリにはそれぞれコントローラ名、ロジック名が設定されます。

// ロガーを自分で生成
var logger = h5.log.createLogger('util'); // 引数にログカテゴリを指定
logger.debug('utilを読み込みました');
// コントローラおよびロジックのロガーを使用
h5.core.expose({
  __name:'app.logic.sampleLogic',
  __construct: function(){
   this.log.debug('{0}の初期化処理を開始します',  this.__name);
  }
});

h5.core.expose({
  __name: 'app.controller.sampleController',
  sampleLogic: app.logic.sampleLogic,
  __construct: function(){
   this.log.debug('{0}の初期化処理を開始します', this.__name);
  }
});

h5.core.controller('body', app.controller.sampleController);

ログのメソッドとログのレベル

出力したいログのレベルによって、使用するメソッドが異なります

メソッド名説明
traceTRACEレベルのログを出力します
debugDEBUGレベルのログを出力します
infoINFOレベルのログを出力します
warnWARNレベルのログを出力します
errorERRORレベルのログを出力します

レベルごとの出力は以下のようになります(Chromeのコンソールに出力した例)。
log_level_chrome.png
ロガーのメソッドの引数は、h5.u.str.formatと同様の形式でメッセージを指定できます。詳細はAPIドキュメント h5.u.str.formatをご覧ください。

ロガーのスタックトレース機能

ロガーのメンバenableStackTraceをtrueに設定すると、スタックトレース機能が有効になります(デフォルトは無効)。

また、maxStackSizeにログに表示するスタックトレースの最大数を設定することができます(デフォルト10件)。

var logger = h5.log.createLogger('sample');
// スタックトレースを有効にする
logger.enableStackTrace = true;
function f(){
  logger.debug('hoge');
}
function f1(){
  f();
}
$(function(){
  $('body').bind('click', function() {
    f1();
  });
  $('body').click();
});

上記のようなコードでログを出力すると、スタックトレースが以下のように表示されます。

[DEBUG]13:11:42,471: hoge  [f () <- f1 () <- HTMLBodyElement.<anonymous> () ...] h5.log.js:367
f ()
f1 ()
HTMLBodyElement.<anonymous> ()
HTMLBodyElement.jQuery.event.handle ()
HTMLBodyElement.jQuery.event.add.elemData.handle.eventHandle ()
Object.jQuery.event.trigger ()
HTMLBodyElement.<anonymous> () 

ログメッセージと同じ行に3件分のスタックトレースが出力され、その下にmaxStackSize分までのスタックトレースが出力されます。

ロガーの設定

ログの設定は、h5.settings.logで設定することができます。

ログの設定はh5preinitイベントハンドラで指定するか、設定後にh5.log.configure();を呼ぶことで反映されます。

ログの設定はh5.log.configure()を呼ぶことで反映されます。設定しただけでは反映されません。h5preinitイベントハンドラでh5.settings.logの設定をしている場合は、hifive読み込み時に設定したログ設定が反映された状態になります。
// h5preinitイベントハンドラで指定する場合(イベントハンドラの設定はhifive読込前に行うこと)
$(document).bind('h5preinit', function(){
  h5.settings.log = {/* ログ設定オブジェクト */};
});
// hifive読込後に設定する場合
h5.settings.log = {/* ログ設定オブジェクト */};
// configure()メソッドを呼んで設定を反映させる
h5.log.configure();

ログ設定オブジェクトは以下のようなオブジェクトで指定します。

h5.settings.log = {
  defaultOut: {/* デフォルトのログ出力設定オブジェクト(後述) */},
  out: [/* カテゴリ毎のログ出力設定オブジェクトの配列(後述) */],
  target: {/* ログターゲット定義オブジェクト(後述) */}
};

ログの重要度について

ログのレベルにはそれぞれのレベルに応じた重要度が数値で設定されています。

ログのレベル数値
TRACE10
DEBUG20
INFO30
WARN40
ERROR50

ログの設定では、出力されるログのレベルの閾値をログのレベル(文字列)または上表の数値を使って指定することができます。指定されたレベル以上のログのみ出力します(指定されたレベル未満のログは出力されません)。

また、ログ設定用に、以下の文字列を使って閾値を設定することができます。

指定文字列数値意味
ALL0全てのレベルのログを出力
NONE-1ログは全て出力しない

文字列でも数値でも指定することができます。文字列の場合、大文字でも小文字でも指定できます。

ログ出力設定オブジェクト

ログ設定オブジェクト(h5.settings.log)のdefaultOut及びoutにはログ出力設定オブジェクトを指定します。

defaultOutは、デフォルトのログ出力の設定を行います。

defaultOutに何も設定しない場合は、h5.dev.jsを使用している場合はDEBUGレベル以上のログをコンソールに出力、minify版のh5.jsを使用している場合はログ出力無し、になります。

outには、ログ出力設定オブジェクトまたはその配列を指定できます。outに設定するログ出力設定オブジェクトにはcategoryを指定して、指定したログカテゴリについての設定を記述します。

h5.settings.log = {
  defaultOut: {
    level: 'warn',       // ログ出力レベルの指定。指定したレベル以上のログのみを出力する
   targets: 'console' // 出力するログターゲット定義名(又はその配列)を指定(後述)
 },
  out: [{
    category: '*Controller',   // ログカテゴリが'Controller'で終わるロガーについての指定
   level: 'trace',                  // 指定したログカテゴリのロガーについてのログ出力レベルの指定
   targets: 'console'           // 出力するログターゲット定義名(又はその配列)を指定(後述)
 }]
};

カテゴリの指定には、'*'による部分一致が可能です。'*Controller'のように設定した場合は、ログカテゴリが'Controller'で終わるロガーについての設定になります。

上記設定の場合、以下のように動作します。

var logger = h5.log.createLogger();
var controller ={
  __name: 'testController',
  __ready: function() {
    logger.trace('trace');        // WARNレベル以下のログは出力されない
   logger.debug('debug');     // WARNレベル以下のログは出力されない
   logger.info('info');            // WARNレベル以下のログは出力されない
   logger.warn('warn');        // 出力される
   logger.error('error');        // 出力される

   // this.logはコントローラのログで、ログカテゴリはコントローラ名。
   // ログカテゴリが'Controller'で終わるロガーなので、TRACEレベル以上のログが出力される
   this.log.trace('trace');       // 出力される
   this.log.debug('debug');    // 出力される
   this.log.info('info');           // 出力される
   this.log.warn('warn');       // 出力される
   this.log.error('error');       // 出力される
 }
};
h5.core.controller('body', controller);

ログターゲット定義

ログはデフォルトではコンソールに出力されますが、ログターゲットを自分で記述することで、出力するときの動作を自分で定義することができます。

ログターゲットには文字列'console'を指定するか、プロパティにログターゲット名、値に以下のメソッドを持つオブジェクトをtypeに持つオブジェクトを指定します。

  • init(obj)
    • ロガーの初期化処理を記述します。hifive読み込み時またはh5.log.configure()を実行して、ロガーの設定を反映させるときに一度だけ呼ばれます。
    • 引数には、ログターゲット定義オブジェクトが渡されます。
  • log(logObj)
    • ログの出力処理を記述します。
    • 引数には、オブジェクトが渡されます。

logメソッドに渡されるログオブジェクトは、以下のようなプロパティと値を持つオブジェクトです。

プロパティ名説明
argsArrayログ出力メソッドに渡された引数リスト
dateDate現在時刻
levelIntegerログ出力レベル(数値)
levelStringStringログ出力レベル(文字列)
stackTraceString||ObjectenableStackTraceがfalseの場合は空文字。trueの場合は以下のようなオブジェクト

recent:3メソッド分のスタックトレース結果(文字列)
all:ロガーのmaxStackSizeに指定された分までのスタックトレース結果(文字列)

以下は、ログをdiv要素に出力するログターゲット定義を作成して、Controllerのログをdiv要素とconsoleの両方に表示するサンプルコードです。

// h5preinitでロガーの設定
$(document).bind('h5preinit', function() {
  h5.settings.log = {
    target: {
      toElement: {
        type: {
         /**
           * ログの出力先(init内で設定)
           */

          _$target: null,

         /**
           * ロガーの初期化処理
           */

          init: function() {
           // ログ出力先要素を、initのタイミングで生成する
           var $target = $('<div class="logTargetElement"></div>');
            $(function() {
              $('body').append($target);
            });
           this._$target = $target;
          },

         /**
           * ログの出力処理
           */

          log: function(logObj) {
           // ログメッセージの作成
           var args = logObj.args;
           var msg = h5.u.str.format.apply(this, args);
           // エレメントの作成
           var $line = this._createLine(msg, logObj.levelString, logObj.date);
           // 出力先に追加
           this._$target.append($line);
          },

         /**
           * ログメッセージのp要素作成
           * @private
           */

          _createLine: function(msg, level, date) {
           // クラスにログレベルを設定、またメッセージをエスケープをしてp要素を作成して返す
           var cls = level.toLowerCase();
           var escapedMsg = h5.u.str.escapeHtml(msg);
           return $('<p class="' + cls + '">(' + date + ')' + escapedMsg + '</p>');
          }
        }
      }
    },
   // *Controllerのロガーはconsoleによる出力とtoElementによる出力が行われる
   out: [{
      category: '*Controller',
      level: 'all',
      targets: ['console', 'toElement']
    }]
  };
});

$(function() {
 // コントローラのバインド
 h5.core.controller('body', {
    __name: 'SampleController',
    __construct: function() {
     this.log.info('{0}を実行', '__construct');
    },
    __init: function() {
     this.log.info('{0}を実行', '__init');
    },
    __ready: function() {
     this.log.info('{0}を実行', '__ready');
    }
  });
});

上記コードを実行すると、div.logTargetElementが生成されて、その中に以下のようにログが出力される。

 (Tue Aug 12 2014 09:21:57 GMT+0900 (東京 (標準時)))__constructを実行
 (Tue Aug 12 2014 09:21:57 GMT+0900 (東京 (標準時)))__initを実行
 (Tue Aug 12 2014 09:21:57 GMT+0900 (東京 (標準時)))__readyを実行


Copyright (C) 2012-2016 NS Solutions Corporation, All Rights Reserved.