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/
AngularJS中实现日志服务的更多相关文章
- 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道么?
在介绍AngularJS自定义服务之前,我们先来了解一下AngularJS~ 学过HTML的人都知道,HTML是一门很好的伪静态文本展示设计的声明式语言,但是,要构建WEB应用的话它就显得乏力了. 而 ...
- angularJS中如何写服务
服务的用途 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性 服务提供了把特定功能相关联的方法集中在一起的接口 如何创建服务 angularJS ...
- AngularJS中的http服务的简单用法
我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...
- 自定义AngularJS中的services服务
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- AngularJs中的服务
一.angularJs中的简单服务应用 下面的例子让我们明白在AngularJs中如何去调用文件中的数据,从而将文件中的数据显示在页面上;改变url的地址,也可以去调用后台接口. 实例: <!D ...
- 使用日志服务进行Kubernetes日志采集
阿里云容器服务Kubernetes集群集成了日志服务(SLS),您可在创建集群时启用日志服务,快速采集Kubernetes 集群的容器日志,包括容器的标准输出以及容器内的文本文件. 新建 Kubern ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- REST服务中的日志可视化(关键技术实现)
引言 在系统构建完成之后,我们通常会使用REST API对外提供服务,在REST API的处理过程中经常会出现一些异想不到的问题(用户权限不足.参数不全.数据库访问异常等),导致请求失败,很多时候用户 ...
- 怎么理解angularjs中的服务?
AngularJS中的服务其实就是提供一种方式抽取共用类库 比如说一些工具类方法,我们传统的做法就是自己写个 utility 类,把相关的工具方法填充到utility里面去,最后把utility类放到 ...
随机推荐
- AngularJs自定义指令详解(2) - template
一些用于定义行为的指令,可能不需要使用template参数. 当指定template参数时,其值可以是一个字符串,表示一段HTML文本,也可以是一个函数,这函数接受两个参数:tElement和tAtt ...
- Nginx环境中如何将HTTP跳转至HTTPS设置
如果我们VPS服务器的WEB环境采用的是NGINX架构,那如果我们将安装SSL证书的网站希望强制跳转至HTTPS网站URL的时候那需要如何设置呢?这里个人建议是这样的,我们必须要强制一个地址,这样网站 ...
- c#开发Mongo笔记第七篇
开发到这里遇到了一些问题,哪到这里想请教一下大家 今天我完成的是菜单功能, public class Menu { public ObjectId _id { get; set; } public i ...
- JavaI/O系统
I/O:(输入/输出)指的是计算机与外部世界,或者一个与计算机其余部分的接口.它对任何计算机系统都非常关键. Java类库中有大量的类,帮助我们从不同的设备读取数据并保存或输出到不同的设备中. 这些类 ...
- homework 11 2016 5 13 读入文件做输入
#include <iostream>#include <fstream> using namespace std; int main(){ string x, y, z; c ...
- js时间 字符串相互转化
js的时间和字符串的转化的讲解是有很多文章的,基本的都是一致的原理.不过曾经碰到过一个比较坑爹的需求,看到网上很少有相关的总结,所以自己简单的记录一下,给后来的同学们点思路. 当时的需求是这样子的,某 ...
- linux ntp 服务器和用户端
ntp 服务器 1.输入 rpm -qa|grep ntp 查看是否安装了ntp服务器 2.如果没安装 yum -y install ntp 安装 3.修改 /etc/ntp.conf 将原serve ...
- FMDB源码阅读
http://www.cnblogs.com/polobymulberry/p/5178770.html
- bookshelf
nodejs mysql ORM 比node-mysql好用多了. bookshelf 支持restful功能,用到的时候研究下:https://www.sitepoint.com/getting-s ...
- leveldb.net对象读写封装
leveldb是一个非常高效的可嵌入式K-V数据库,在.NET下有着基于win实现的包装leveldb.net;不过leveldb.net只提供了基于byte[]和string的处理,这显然会对使用的 ...