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.
分享到:
相关推荐
标题 "Pure JS (6.2):结合 Rhino 和 Junit GUI 测试 JS" 提到的是一个关于使用纯JavaScript(Pure JS)与Rhino JavaScript引擎以及JUnit进行图形用户界面(GUI)测试的实践方法。Rhino是Mozilla基金会开发的一个...
3D建模软件:Rhino二次开发_3D打印与Rhino二次开发.docx 3D建模软件:Rhino二次开发_RhinoCommonAPI详解.docx 3D建模软件:Rhino二次开发_RhinoScriptSyntax入门.docx 3D建模软件:Rhino二次开发_Rhino二次开发基础....
在实现上,pure.db.js会利用Rhino的Java对象转换机制,将JavaScript对象转化为Java对象,再由MongoDB的Java驱动执行实际的数据库操作。反过来,查询结果也会被转化为JavaScript对象返回,保持了JavaScript的原生体验...
**标题解析:** "Pure JS (6.1):使用 Rhino Shell 和 Debugger 运行和调试 JS" 这个标题表明我们将深入探讨如何利用Rhino Shell和JavaScript的调试工具来执行和调试纯JavaScript代码。Rhino是Mozilla开发的一个开源...
《深入浅出Rhino:Java与JS互操作》是一本专注于探讨如何在Java环境中使用Rhino JavaScript引擎进行交互的书籍。Rhino是Mozilla基金会开发的一个开源JavaScript解释器,它完全用Java编写,使得JavaScript能够在Java...
* 常用概念解释:RHINO 软件中的一些基本概念,例如坐标系、视图、实体等。 第三章:界面和导航操作 * 界面初识:RHINO 软件的界面布局,包括菜单栏、工具栏、命令栏等。 * 单位和模板:RHINO 软件中的单位和模板...
3. **Java与JavaScript交互**:Rhino允许JavaScript直接调用Java对象和方法,反之亦然,这使得开发者可以用JavaScript控制Java应用程序,或者用Java扩展JavaScript的功能。这种互操作性是通过JavaScript的`Packages`...
"dcsdc" 作为一个标签,也无法确定它与IT行业的具体关联,而"rhino7"可能指的是Rhino 7,这是一个3D建模软件。不过,没有更多的详细信息,如具体的特性、功能、使用场景或教程等,我无法提供深入的解释。 如果...
视频教程
7. **精度与优化**:Rhino允许用户在建模过程中设定精度,确保模型的质量和计算效率。教程将涵盖如何根据项目需求合理设定精度,以及优化模型以减少计算负担。 8. **逆向工程**:Rhino在逆向工程中表现出色,能处理...
视频教程
7. **兼容性**:Rhino4.0的雕刻结果与其他建模软件兼容,如3DS Max、Maya等,使得模型可以无缝导入到其他工作流程中。 8. **学习资源**:Rhino4.0曲面雕刻工具的使用可以通过教程和在线资源进行学习,帮助初学者...
rhino-engine-1.7.13.jar
Java直接调用js文件框架rhino-1.7.9源代码 https://github.com/mozilla/rhino/releases
以下是关于Rhino 5.0在机械设计中的重要知识点: 1. **NURBS建模**:Rhino 5.0的核心是其NURBS模型处理能力,能创建、编辑和导入/导出各种复杂的几何形状,包括曲线、曲面和实体,适合制作精确的机械零件模型。 2....
1. **Java与JavaScript交互**:Rhino允许Java对象直接在JavaScript环境中使用,反之亦然。这意味着开发者可以在JavaScript脚本中调用Java类库,或者在Java程序中执行JavaScript代码。 2. **兼容ECMAScript规范**:...
5. **兼容性**:Rhino 4.0与其他CAD软件有良好的数据交换能力,支持导入和导出多种格式,如IGES、STEP、OBJ、3DM等,这使得它能够无缝集成到更广泛的工程流程中。 6. **逆向工程**:Rhino在逆向工程方面表现出色,...
Rhino的jar包。 Rhino 是开源的 JavaScript 引擎,是完全基于 Java 实现,几乎可以使用 JavaScript 完成 Java 所有的工作。