如何使用log4javascript框架从angularjs应用程序向服务器发送日志消息?

时间:2015-07-09 19:02:41

标签: c# angularjs asp.net-web-api

我在angular js中有以下代码来准备一个记录器,用于向服务器发送消息。

var demo = angular.module('ng-logging', []);

demo.config(function ($provide) {

    $provide.decorator('$log', function ($delegate, $sniffer) {

        var _info = $delegate.info; //Saving the original behavior
        var _error = $delegate.error; //Saving the original behavior
        var log = log4javascript.getLogger();
        var ajaxAppender = new log4javascript.AjaxAppender('/api/log');

        ajaxAppender.setThreshold(log4javascript.Level.ALL);

        log.addAppender(ajaxAppender);

        $delegate.info = function (msg) {
            _info(msg);
            log.info(msg);
        };

        $delegate.error = function (msg) {
            _error(msg);
            log.error(msg);
        };

        return $delegate;
    });
});

服务器端:

public class PaymentController : ApiController
{
    [Route("api/log")]
    public void Log(string message)
    {

    }
}

用法:我正在尝试使用上面配置的$ log提供程序向服务器发送消息,如下所示。

var payControllers = angular.module('pay.controllers', ['ui.bootstrap']);

payControllers.controller('PaymentCtrl', ['$scope', '$location', '$routeParams', 'payDataService',
  function ($scope, $location, $routeParams, service, $log) {

$scope.sendPayment = function () { 
    $log.info("Sending payment");
    };
 }]);

当我测试这个时,我收到一条错误消息,说“$ log is undefined'”。我不确定实现这个的正确方法是什么。我试着关注这篇文章。 http://statelessprime.blogspot.com/2013/10/send-logging-and-exceptions-to-server.html

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

以下是我如何完成客户端相同的事情。我通过在主模块上定义工厂方法来覆盖默认的$ log角度记录器。 (angular已经在$ log中定义了一个记录器)。这可能是你得到$ log未定义的原因。我还注意到你没有为你的appender设置布局。我推荐使用json布局。否则你只得到一个http帖子,你必须自己解析字符串。我无法帮助您服务器端,因为我不知道您正在使用哪种Web框架。最后,不要忘记注入" $ log"进入你的工厂/指令。

angular.module('main_module')
.factory('$log', function() {
    var logger = log4javascript.getLogger();

    var ajaxAppender = new log4javascript.AjaxAppender("/restfulConfigApi/logger.api");
    ajaxAppender.addHeader("Content-Type", "application/json");
    ajaxAppender.setWaitForResponse(true);
    ajaxAppender.setLayout(new log4javascript.JsonLayout());

    //ajaxAppender.setRequestSuccessCallback(requestCallback);
    logger.addAppender(ajaxAppender);
    return logger;
});

注入$ log

的示例

(function(){     '使用严格的';

angular.module("main_module").directive('a directive', a_directive);
conContextualIntelligencePublisher.$inject = [ "blah"... , "$log"];

function a_directive(blah ... , $log) { ... }