3

ログを 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 をプロバイダー内で渡し、デコレーターに返す方法について混乱しています。

4

1 に答える 1