AngularJS中实现日志服务

本篇体验使用AngularJS自定义一个记录日志的服务。

在AngularJS中,服务的一些写法是这样的:

var app = angular.module(‘app‘,[]);

app.provider(‘providerName‘, function(){...});
app.service(‘serviceName‘, function(){});
app.factory(‘factoryName‘, function(){});

等同于:

app.config([‘$provide‘, function($provide){
    $provide.provider(‘providerName‘, function(){...});
}])

app.config([‘$provide‘, function($provide){
    $provide.service(‘serviceName‘, function(){...});
}])

app.config([‘$provide‘, function($provide){
    $provide.factory(‘factoryName‘, function(){...});
}])

而实际上,$provider.service()和$provider.factory()也可以通过$provider.provider()以注入的方式实现。

app.config([‘$provide‘, function($provide){
    $provide.service(‘serviceName‘, function(){
        this.name = "";
        this.author = "";
    })
}])

以上等同于:

app.config([‘$provide‘,‘$injector‘, function($provide, $injector){
    $provide.provider(‘serviceName‘, function(){
       this.$get = function($injector) {
        return $injector.instantiate(function(){
            this.name = "";
            this.author = "";
        });
       }
    });
}])

以上,也就是说,service本身就是一个provider,可以通过$injector来初始化一个service。

同理,我们这样写factory:

app.config([‘$provide‘, function($provide){
    $provide.factory(‘factoryName‘, function(){
        return {name:‘‘, author:‘‘};
    })
}])

以上等同于:

app.config([‘$provide‘, ‘$injector‘,function($provide, $injector){
    $provide.provider(‘factoryName‘, function(){
        this.$get = function($injector){
            return $injector.invoke(function(){
                return {name:‘‘, author:‘‘}
            })
        }
    })
}])

创建自己的provider

$provide.provider(‘appColor‘, function(){
    var color = ‘red‘;

    this.setColor = function(newColor){
        color = newColor;
    }

    thi.$get = function(){
        return color;
    }
})

我们可以在config中使用appColor这个自定义的provider的方法进行一些设置。

app.config([‘appColorProvider‘, function(appColorProvider){
    appColorProvider.setColor(‘green‘);
}])

然后在run中注入appColor这个服务。

app.run([‘appColor‘, funciton(appColor){
    console.log(appColor);
}])

创建日志服务

假设需要的日志格式如下:

<timestamp> - <context>::<method name>(‘<message>‘)
<timestamp> - <context>: <message>

创建一个有关日志的类:

var Logger = function(context){
    this.context = context;
}

Logger.getInstance = function(context){
    return new Logger(context);
}

//替代
Logger.supplant = function(str, o){
    return str.replace(/\{([^{}]*)\}/g, function(a, b){
        var r = o[b];
        return typeof r === ‘string‘ || typeof r === ‘number‘ ? r:a;
    })
}

//格式化时间
Logger.getFormattedTimestamp = funciton(date){
    return Logger.supplant(‘{0}:{1}:{2}:{3}‘, [
       date.getHours() ,
       date.getMinutes(),
       date.getSeconds(),
       date.getMilleseconds()
    ]);
}

Logger.prototype = {
    _log: function(originalFn, args){
        var now = Logger.getFormattedTimestamp(new Date());
        var message = ‘‘, supplantDate = [];
        switch(args.length){
            //打印格式:<timestamp> - <context>: <message>
            case 1:
                message = Logger.supplant("{0} - {1}:{2}", [now, this.context, args[0]]);
                break;
            case 3:
                //打印格式:<timestamp> - <context>::<method name>(‘<message>‘)
                //第一个参数是方法名
                //第二个参数是消息
                //第三各参数是对象
                supplantData = args[2];
                message = Logger.supplant("{0} - {1}::{1}(\‘{3}\‘)",[now, this.context, args[0], args[1]]);
                break;
            case 2:
                //检测第二个参数类型
                if(typeof args[1] === ‘string‘){
                    message = Logger.supplant("{0} - {1}::{2}(\‘{3}\‘)",[now, this.context, args[0], args[1]]);
                } else {
                    sup;antData = args[1];
                    message = Logger.supplant("{0} - {1}:{2}", [now, this.context.args[0]])
                }
                break;
        }

        $log[originalFn].call(null, Logger.supplant(message, suppantData));
    },
    log: function(){
        this._log(‘log‘, arguments);
    },
    info: function(){
        this._log(‘info‘, arguments);
    },
    warn: function(){
        this._log(‘warn‘, arguments);
    },
    debug: function(){
        this._log(‘debug‘, argments);
    },
    error: function(){
        this._log(‘error‘, arguments);
    }
};

我们可能按如下使用这个日志类:

//Example是类或文件或module的名称
var logger = Logger.getInstance(‘Example‘);
logger.log(‘this is a alog‘);
logger.warn(‘warn‘, ‘this is a worn‘);
logger.error(‘this is a {0} error {1}‘,[‘big‘,‘hello‘]);

完整代码如下:

app.provider(‘Logger‘, [function(){
    var isEnabled = true;
    this.enabled = function(_isEnabled){
        isEnabled = !!_isEnabled;
    }

    this.$get = [‘$log‘, function($log){

    var Logger = function(context){
        this.context = context;
    }

    Logger.getInstance = function(context){
        return new Logger(context);
    }

    //替代
    Logger.supplant = function(str, o){
        return str.replace(/\{([^{}]*)\}/g, function(a, b){
            var r = o[b];
            return typeof r === ‘string‘ || typeof r === ‘number‘ ? r:a;
        })
    }

    //格式化时间
    Logger.getFormattedTimestamp = funciton(date){
        return Logger.supplant(‘{0}:{1}:{2}:{3}‘, [
           date.getHours() ,
           date.getMinutes(),
           date.getSeconds(),
           date.getMilleseconds()
        ]);
    }

    Logger.prototype = {
        _log: function(originalFn, args){
            if(!isEnabled){
                return;
            }

            var now = Logger.getFormattedTimestamp(new Date());
            var message = ‘‘, supplantDate = [];
            switch(args.length){
                //打印格式:<timestamp> - <context>: <message>
                case 1:
                    message = Logger.supplant("{0} - {1}:{2}", [now, this.context, args[0]]);
                    break;
                case 3:
                    //打印格式:<timestamp> - <context>::<method name>(‘<message>‘)
                    //第一个参数是方法名
                    //第二个参数是消息
                    //第三各参数是对象
                    supplantData = args[2];
                    message = Logger.supplant("{0} - {1}::{1}(\‘{3}\‘)",[now, this.context, args[0], args[1]]);
                    break;
                case 2:
                    //检测第二个参数类型
                    if(typeof args[1] === ‘string‘){
                        message = Logger.supplant("{0} - {1}::{2}(\‘{3}\‘)",[now, this.context, args[0], args[1]]);
                    } else {
                        sup;antData = args[1];
                        message = Logger.supplant("{0} - {1}:{2}", [now, this.context.args[0]])
                    }
                    break;
            }

            $log[originalFn].call(null, Logger.supplant(message, suppantData));
        },
        log: function(){
            this._log(‘log‘, arguments);
        },
        info: function(){
            this._log(‘info‘, arguments);
        },
        warn: function(){
            this._log(‘warn‘, arguments);
        },
        debug: function(){
            this._log(‘debug‘, argments);
        },
        error: function(){
            this._log(‘error‘, arguments);
        }
    };    

        return Logger;
    }]
}])

在全局关闭自定义的Logger。

app.config([‘LoggerProvider‘, function(LoggerProvider){
    LoogerProvider.enabled(false);
}])

参考:http://www.webdeveasy.com/service-providers-in-angularjs-and-logger-implementation/

时间: 2024-07-31 14:33:35

AngularJS中实现日志服务的相关文章

自定义AngularJS中的services服务

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="X-UA-Compatible"content="IE=edge" /> <meta name="viewport"

辛星浅析linux中的日志

linux中对于连接时间的日志,一般由/var/log/wtmp和/var/run/utmp这两个文件记录,不过这两个文件无法直接使用cat查看,并且该文件由系统自动更新,我们可以通过w.who.finger.id.last.lastlog.ac命令进行查看. linux中对于进程的监控日志,首先说进程监控日志在监控用户的操作指令是很有效的,当服务器最近发现经常发生无故宕机或者无故被人删除文件等现象时,可以通过使用进程统计日志来查看.我们使用accton  /var/account/pacct来

使用日志服务进行Kubernetes日志采集

阿里云容器服务Kubernetes集群集成了日志服务(SLS),您可在创建集群时启用日志服务,快速采集Kubernetes 集群的容器日志,包括容器的标准输出以及容器内的文本文件. 新建 Kubernetes 集群 如果您尚未创建任何的 Kubernetes 集群,可以按照本节的步骤来进行操作: 登录 容器服务管理控制台. 单击左侧导航栏中集群,单击右上角创建Kubernetes集群. 进入创建页面后,参见创建Kubernetes集群进行配置. 拖动到页面底部,勾选日志服务配置项,表示在新建的

接口服务中的日志

先来看下日志对于一个接口服务的作用: 监控服务的状态,一般程序中会增加一些跟踪或者提示性的日志,用来判断服务执行的详细情况,特别是执行一些复合功能的接口或者叫聚合接口非常有利于我们判断接口的执行情况 安全,用来分析调用者的身份信息,防止接口被非法恶意调用等 性能,可以统计每个接口的访问执行时间来分析系统的瓶颈 异常分析,对于线上的异常,在没有debug的环境下,要想分析问题原因最有价值的就要算异常的堆栈信息 上面的这几点需求,如果接口服务使用的是一些高级产品比如dubbo,其实它已经实现了大部分

AngularJS 中的Promise --- $q服务详解

    阅读目录 什么是Promise $q服务 先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 回到顶部 什么是Promise 以前了解过Ajax的都能体会到回调的痛苦,同步的代码很容易调试,但是异步回调的代码,会让开发者陷入泥潭,无法跟踪,比如: funA(arg1,arg2,function(){ funcB(arg1,arg2,function(){ funcC(arg

REST服务中的日志可视化(关键技术实现)

引言 在系统构建完成之后,我们通常会使用REST API对外提供服务,在REST API的处理过程中经常会出现一些异想不到的问题(用户权限不足.参数不全.数据库访问异常等),导致请求失败,很多时候用户并不能理解这些失败是如何造成的,他们更多的是直接找到相应的开发者询问:“我的这个接口失败了,没有拿到数据,帮忙看一下吧”,更为复杂的是当我们询问其他用户的时候,他们却说:“你这个接口是正常的啊”,开发者这时就很郁闷:“我又没对你做特殊处理,怎么别人是好的,偏偏就你的失败”(本人在工作初期,经常遇到此

深入理解AngularJS中的ng-bind-html指令和$sce服务

angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model.但在我们的项目当中会遇到这样的情况,后台返回的数据中带有各种各样的html标签.如: $scope.currentWork.description = "hello,<br><b>今天我们去哪里?</b>" 我们用ng-bind-html这样的指令来绑定,结果却不是我们想要的.是这样的 hello, 今天我们

黄聪:AngularJS中的$resource使用与Restful资源交互(转)

原文:http://blog.csdn.net/he90227/article/details/50525836 1.AngularJS中的 $resource 这个服务可以创建一个资源对象,我们可以用它非常方便地同支持RESTful的服务端数据源进行交互,当同支持RESTful的数据模型一起工作时,它就派上用场了.      REST是Representational State Transfer(表征状态转移)的缩写,是服务器用来智能化地提供数据服务的一种方式 1)我们首先需要引入ng-Re

Linux 中的文件共享服务

Linux 中的文件共享服务 ============================================================================== 概述:    本章将主要介绍文件共享服务中的ftp服务,内容包括:ftp的程序环境,配置文件的相关介绍,以及如何配置基于虚拟用户的vsftpd服务 文件服务 1)介绍 ★ftp: 应用层,C/S架构,文件共享:file transfer protocol: ★nfs,cifs:文件系统接口,网络文件系统: ☉n