ログを http 経由でバックエンドに送信するために、angularjs で $log サービスを装飾しようとしています。私はこのようなものを使用してこれを行うことができました:
app.config(['$provide', function ($provide) {
$provide.decorator('$log', ['$delegate', loggerDecorator]);
}]);
var loggerDecorator = function ($delegate) {
...decorating logic
$delegate.log = prepareLogFn($delegate.log);
return $delegate;
}
これは問題ありませんが、デリミタ、リモート API URL などを設定するために、モジュールの構成フェーズで構成できるように、プロバイダをデコレータとして使用することをお勧めします。
次のようなプロバイダーを作成してみました。
angular.module('mods.logging').factory(serviceId, [backendLoggingDecorator]);
function backendLoggingDecorator() {
var remoteUri = '';
return {
setRemoteUri: function (uri) {
remoteUri = uri;
},
$get: function ($delegate) {
var ajaxLogger = log4javascript.getLogger();
var ajaxAppender = new log4javascript.AjaxAppender(remoteUri);
ajaxAppender.setThreshold(log4javascript.Level.ALL);
ajaxLogger.addAppender(ajaxAppender);
function prepareLogFn(loggingFunc) {
return function () {
if (ajaxLogger) ajaxLogger.info(arguments);
loggingFunc.apply(null, args);
};
}
$delegate.log = prepareLogFn($delegate.log);
return $delegate;
}
};
}
そして、次のようなことをします:
app.config(['$provide', function ($provide) {
$provide.decorator('$log', ['backendLoggingDecorator', function(bld) {
return bld;
}]);
}]);
しかし、実際の $delegate をプロバイダー内で渡し、デコレーターに返す方法について混乱しています。