ロガーの使用方法と設定
ロガーの使用方法
ロガーの使用方法には、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);
ログのメソッドとログのレベル
出力したいログのレベルによって、使用するメソッドが異なります
メソッド名 | 説明 |
---|---|
trace | TRACEレベルのログを出力します |
debug | DEBUGレベルのログを出力します |
info | INFOレベルのログを出力します |
warn | WARNレベルのログを出力します |
error | ERRORレベルのログを出力します |
レベルごとの出力は以下のようになります(Chromeのコンソールに出力した例)。
ロガーのメソッドの引数は、h5.u.str.formatと同様の形式でメッセージを指定できます。詳細はAPIドキュメント h5.u.str.formatをご覧ください。
ロガーのスタックトレース機能
ロガーのメンバenableStackTraceをtrueに設定すると、スタックトレース機能が有効になります(デフォルトは無効)。
また、maxStackSizeにログに表示するスタックトレースの最大数を設定することができます(デフォルト10件)。
// スタックトレースを有効にする
logger.enableStackTrace = true;
function f(){
logger.debug('hoge');
}
function f1(){
f();
}
$(function(){
$('body').bind('click', function() {
f1();
});
$('body').click();
});
上記のようなコードでログを出力すると、スタックトレースが以下のように表示されます。
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();を呼ぶことで反映されます。
$(document).bind('h5preinit', function(){
h5.settings.log = {/* ログ設定オブジェクト */};
});
h5.settings.log = {/* ログ設定オブジェクト */};
// configure()メソッドを呼んで設定を反映させる
h5.log.configure();
ログ設定オブジェクトは以下のようなオブジェクトで指定します。
defaultOut: {/* デフォルトのログ出力設定オブジェクト(後述) */},
out: [/* カテゴリ毎のログ出力設定オブジェクトの配列(後述) */],
target: {/* ログターゲット定義オブジェクト(後述) */}
};
ログの重要度について
ログのレベルにはそれぞれのレベルに応じた重要度が数値で設定されています。
ログのレベル | 数値 |
---|---|
TRACE | 10 |
DEBUG | 20 |
INFO | 30 |
WARN | 40 |
ERROR | 50 |
ログの設定では、出力されるログのレベルの閾値をログのレベル(文字列)または上表の数値を使って指定することができます。指定されたレベル以上のログのみ出力します(指定されたレベル未満のログは出力されません)。
また、ログ設定用に、以下の文字列を使って閾値を設定することができます。
指定文字列 | 数値 | 意味 |
---|---|---|
ALL | 0 | 全てのレベルのログを出力 |
NONE | -1 | ログは全て出力しない |
文字列でも数値でも指定することができます。文字列の場合、大文字でも小文字でも指定できます。
ログ出力設定オブジェクト
ログ設定オブジェクト(h5.settings.log)のdefaultOut及びoutにはログ出力設定オブジェクトを指定します。
defaultOutは、デフォルトのログ出力の設定を行います。
defaultOutに何も設定しない場合は、h5.dev.jsを使用している場合はDEBUGレベル以上のログをコンソールに出力、minify版のh5.jsを使用している場合はログ出力無し、になります。
outには、ログ出力設定オブジェクトまたはその配列を指定できます。outに設定するログ出力設定オブジェクトにはcategoryを指定して、指定したログカテゴリについての設定を記述します。
defaultOut: {
level: 'warn', // ログ出力レベルの指定。指定したレベル以上のログのみを出力する
targets: 'console' // 出力するログターゲット定義名(又はその配列)を指定(後述)
},
out: [{
category: '*Controller', // ログカテゴリが'Controller'で終わるロガーについての指定
level: 'trace', // 指定したログカテゴリのロガーについてのログ出力レベルの指定
targets: 'console' // 出力するログターゲット定義名(又はその配列)を指定(後述)
}]
};
カテゴリの指定には、'*'による部分一致が可能です。'*Controller'のように設定した場合は、ログカテゴリが'Controller'で終わるロガーについての設定になります。
上記設定の場合、以下のように動作します。
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メソッドに渡されるログオブジェクトは、以下のようなプロパティと値を持つオブジェクトです。
プロパティ名 | 型 | 説明 |
---|---|---|
args | Array | ログ出力メソッドに渡された引数リスト |
date | Date | 現在時刻 |
level | Integer | ログ出力レベル(数値) |
levelString | String | ログ出力レベル(文字列) |
stackTrace | String||Object | enableStackTraceがfalseの場合は空文字。trueの場合は以下のようなオブジェクト recent:3メソッド分のスタックトレース結果(文字列) all:ロガーのmaxStackSizeに指定された分までのスタックトレース結果(文字列) |
以下は、ログをdiv要素に出力するログターゲット定義を作成して、Controllerのログをdiv要素とconsoleの両方に表示するサンプルコードです。
$(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を実行