`
裴小星
  • 浏览: 265696 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
8ccf5db2-0d60-335f-a337-3c30d2feabdb
Java NIO翻译
浏览量:27841
F3e939f0-dc16-3d6e-8c0b-3315c810fb91
PureJS开发过程详解
浏览量:74314
07a6d496-dc19-3c71-92cf-92edb5203cef
MongoDB Java ...
浏览量:63056
社区版块
存档分类
最新评论

PureJS (6.3):Rhino 中的日志与 proxy 对象

阅读更多
PureJS (6.3):Rhino 中的日志与 proxy 对象

  这篇文章里我们将继续探讨日志处理(pure.log)和 proxy 对象(pure.proxy)。结合使用 pure.log 和 pure.proxy 可以实现灵活的日志处理,有效地分离业务逻辑和日志记录的代码。pure.log 是在 slf4j 和 log4j 的基础上完成的;pure.proxy 是利用 Rhinio JS 的 __noSuchMethod__ 实现的。

代码示例

  下载附件中的 PureJS 工程,打开文件 scripts/app/proxy/log.js ,可以看到如下代码:
(function() {
	// 分别用不同的名称注册两个 log 对象
	var timeLog = pure.log("pure.log.time");
	var aroundLog = pure.log("pure.log.around");

	// 表示日志输出格式的字符串
	var timeString = "{}.{}() completed in {} seconds.";
	var inputString = "Excuting {}.{}(), with param: {}.";
	var outputString = "{}.{}() completed, with result: {}.";

	// proxy.log 对象,用于记录日志,优先级 100
	proxy.log = { priority: 100 };

	// proxy.log.time 对象,记录执行时间
	proxy.log.time = {
		// 优先级 80,将在内层执行
		priority: 80,

		// 截获以 "api."、"page."、"dbo." 开头的表达式
		expr: /^(api|page|dbo)\./,

		// 代理函数,name: 对象名称,method:函数名称,args:函数调用参数
		func: function(name, method, args) {

			// 在执行函数的前后,插入计执行时间的代码
			var start = new Date().getTime();
			var ret = this[method].apply(this, args);			
			var seconds = (new Date().getTime() - start) / 1000;

			// 输出日志并返回
			timeLog.info(timeString, [ name, method, seconds ]);
			return ret;
		}
	}

	// proxy.log.around 对象,记录函数的输入和输出
	proxy.log.around = {
		// 优先级 100,将在外层执行
		priority: 100,

		// 截获以 "api."、"page."、"dbo." 开头的表达式
		expr: /^(api|page|dbo)\./,

		// 代理函数,name: 对象名称,method:函数名称,args:函数调用参数
		func: function(name, method, args) {

			// 执行函数前,将第一个参数序列化后输出到日志
			var toLog = JSON.stringify(args[0]);
			aroundLog.info(inputString, [name, method, toLog]);

			// 执行函数
			var ret = this[method].apply(this, args);

			// 缩短函数执行结果并序列化,输出到日志
			toLog = JSON.stringify(shorten());
			aroundLog.info(outputString, [name, method, toLog]);

			// 返回结果
			return ret;

			// 缩短 ret 以便显示,实现略。
			function shorten() { ... }
		}
	}
}());

  要使得 proxy 生效,还需要通过 pure.proxy(name) 创建对象,比如在scripts/app/api/users.js 中创建 dbo.users 的 proxy:
api.users = function(){
	return {
		save: function(params) {
			pure.proxy("dbo.users").save(params);
		},
		remove: function(params) {
			pure.proxy("dbo.users").remove(params);
		}
	}
}();


执行顺序

  proxy.log 中的函数与被截获的核心代码的执行顺序如下图所示(priority 较大的在较外层):



实际运行结果

  启动 mongod,并像 6.1 中介绍的那样用 Rhino 启动项目,我们可以看到如下日志:
引用
2011-07-30 07:51:01  INFO pure.log.around - Excuting page.index(), with param: undefined.
2011-07-30 07:51:01  INFO pure.log.around - Excuting dbo.users.list(), with param: undefined.
2011-07-30 07:51:01  INFO pure.log.time - dbo.users.list() completed in 0.004 seconds.
2011-07-30 07:51:01  INFO pure.log.around - dbo.users.list() completed, with result: [{"name":"user1","desc":"desc1"},{"name":"user2","desc":"desc2"},{"name":"user3","desc":"desc3"}].
2011-07-30 07:51:02  INFO pure.log.time - page.index() completed in 0.271 seconds.
2011-07-30 07:51:02  INFO pure.log.around - page.index() completed, with result: "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-str...".


  在界面的输入框中输入 user 的 name 和 desc,并点击save,可以看到如下日志:
引用
2011-07-30 07:52:08  INFO pure.log.around - Excuting api.users.save(), with param: {"name":"aaa","desc":"bbb"}.
2011-07-30 07:52:08  INFO pure.log.around - Excuting dbo.users.save(), with param: {"name":"aaa","desc":"bbb"}.
2011-07-30 07:52:08  INFO pure.log.time - dbo.users.save() completed in 0.001 seconds.
2011-07-30 07:52:08  INFO pure.log.around - dbo.users.save() completed, with result: undefined.
2011-07-30 07:52:08  INFO pure.log.time - api.users.save() completed in 0.003 seconds.
2011-07-30 07:52:08  INFO pure.log.around - api.users.save() completed, with result: undefined.


24
24
分享到:
评论

相关推荐

    Pure JS (6.2):结合 Rhino 和 Junit GUI 测试 JS

    标题 "Pure JS (6.2):结合 Rhino 和 Junit GUI 测试 JS" 提到的是一个关于使用纯JavaScript(Pure JS)与Rhino JavaScript引擎以及JUnit进行图形用户界面(GUI)测试的实践方法。Rhino是Mozilla基金会开发的一个...

    3D建模软件:Rhino二次开发-Rhino二次开发基础+几何形状创建+3D建模核心+3D打印等全套教程

    3D建模软件:Rhino二次开发_3D打印与Rhino二次开发.docx 3D建模软件:Rhino二次开发_RhinoCommonAPI详解.docx 3D建模软件:Rhino二次开发_RhinoScriptSyntax入门.docx 3D建模软件:Rhino二次开发_Rhino二次开发基础....

    Pure JS (4.3): pure.db.js 的实现(基于 MongoDB Rhino Driver)

    在实现上,pure.db.js会利用Rhino的Java对象转换机制,将JavaScript对象转化为Java对象,再由MongoDB的Java驱动执行实际的数据库操作。反过来,查询结果也会被转化为JavaScript对象返回,保持了JavaScript的原生体验...

    Pure JS (6.1):使用 Rhino Shell 和 Debugger 运行和调试 JS

    **标题解析:** "Pure JS (6.1):使用 Rhino Shell 和 Debugger 运行和调试 JS" 这个标题表明我们将深入探讨如何利用Rhino Shell和JavaScript的调试工具来执行和调试纯JavaScript代码。Rhino是Mozilla开发的一个开源...

    深入浅出Rhino:Java与JS互操作

    《深入浅出Rhino:Java与JS互操作》是一本专注于探讨如何在Java环境中使用Rhino JavaScript引擎进行交互的书籍。Rhino是Mozilla基金会开发的一个开源JavaScript解释器,它完全用Java编写,使得JavaScript能够在Java...

    RHINO犀牛基础教程.doc

    * 常用概念解释:RHINO 软件中的一些基本概念,例如坐标系、视图、实体等。 第三章:界面和导航操作 * 界面初识:RHINO 软件的界面布局,包括菜单栏、工具栏、命令栏等。 * 单位和模板:RHINO 软件中的单位和模板...

    FF的js引擎rhino源码,java编写

    3. **Java与JavaScript交互**:Rhino允许JavaScript直接调用Java对象和方法,反之亦然,这使得开发者可以用JavaScript控制Java应用程序,或者用Java扩展JavaScript的功能。这种互操作性是通过JavaScript的`Packages`...

    rhino7rhino777777777777777

    "dcsdc" 作为一个标签,也无法确定它与IT行业的具体关联,而"rhino7"可能指的是Rhino 7,这是一个3D建模软件。不过,没有更多的详细信息,如具体的特性、功能、使用场景或教程等,我无法提供深入的解释。 如果...

    课时3:Rhino7视图与工具基本操作讲解.mp4

    视频教程

    rhino高级技巧

    7. **精度与优化**:Rhino允许用户在建模过程中设定精度,确保模型的质量和计算效率。教程将涵盖如何根据项目需求合理设定精度,以及优化模型以减少计算负担。 8. **逆向工程**:Rhino在逆向工程中表现出色,能处理...

    课时82:Rhino7桥接与对称(三或四管混接).mp4

    视频教程

    Rhino4.0曲面雕刻工具

    7. **兼容性**:Rhino4.0的雕刻结果与其他建模软件兼容,如3DS Max、Maya等,使得模型可以无缝导入到其他工作流程中。 8. **学习资源**:Rhino4.0曲面雕刻工具的使用可以通过教程和在线资源进行学习,帮助初学者...

    rhino-engine-1.7.13.jar

    rhino-engine-1.7.13.jar

    Java直接调用js文件框架rhino-1.7.9源代码

    Java直接调用js文件框架rhino-1.7.9源代码 https://github.com/mozilla/rhino/releases

    rhino5.0机械设计软件.rar

    以下是关于Rhino 5.0在机械设计中的重要知识点: 1. **NURBS建模**:Rhino 5.0的核心是其NURBS模型处理能力,能创建、编辑和导入/导出各种复杂的几何形状,包括曲线、曲面和实体,适合制作精确的机械零件模型。 2....

    java运行js脚本引擎-----rhino

    1. **Java与JavaScript交互**:Rhino允许Java对象直接在JavaScript环境中使用,反之亦然。这意味着开发者可以在JavaScript脚本中调用Java类库,或者在Java程序中执行JavaScript代码。 2. **兼容ECMAScript规范**:...

    rhino4.0机械设计软件.rar

    5. **兼容性**:Rhino 4.0与其他CAD软件有良好的数据交换能力,支持导入和导出多种格式,如IGES、STEP、OBJ、3DM等,这使得它能够无缝集成到更广泛的工程流程中。 6. **逆向工程**:Rhino在逆向工程方面表现出色,...

    rhino-1.7.7.1.jar(Rhino for java)

    Rhino的jar包。 Rhino 是开源的 JavaScript 引擎,是完全基于 Java 实现,几乎可以使用 JavaScript 完成 Java 所有的工作。

Global site tag (gtag.js) - Google Analytics