using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;

namespace VirtualRemote.log4net
{
public class LogHandler : ICallHandler
{
/// <summary>
/// ICallHandler的成员,表执行顺序
/// </summary>
public int Order
{
get;
set;
}

//每条记录 的拼接.记录
private void Log(ref System.Text.StringBuilder sb,string format, params object[] args)
{
string tmp = string.Format(format, args);
sb.AppendLine(tmp);
VirtualRemote.Common.Debug(tmp);
}

public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{

System.Text.StringBuilder sb = new StringBuilder();
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
IMethodReturn retvalue = getNext()(input, getNext);//在这里执行方法
sw.Stop();

Log(ref sb, "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");
Log(ref sb, "┃方法名: {0}",input.MethodBase.Name);

//((Microsoft.Practices.Unity.InterceptionExtension.ParameterCollection)(retvalue.Outputs)).arguments

object value;
for (var i = 0; i < input.Arguments.Count; i++)
{
var arg = input.Arguments.GetParameterInfo(i);
if (arg.IsOut || arg.IsRetval)
{
//if (retvalue.Outputs.ContainsParameter(arg.Name))
value = retvalue.Outputs[arg.Name];
}
else
{
value = input.Arguments[i];
}
Log(ref sb, "┃参数〖{0}.{1}〗= {2}", i, arg.Name, GetObjectString(value));
}

if (retvalue.Exception == null) // retvalue.Exception=null说明函数执行时没有抛出异常
{
var returnvalue = retvalue.ReturnValue;
if (returnvalue != null)
{
Log(ref sb, "┃返回值: {0}", GetObjectString(returnvalue));
}
else
{
Log(ref sb, "┃返回值: {0}","void");
}
}
else
{
Log(ref sb, "★ {0}",retvalue.Exception.ToString());
//retvalue.Exception = null; // 将retvalue.Exception设为null表示异常已经被处理过了,
// 如果不把retvalue.Exception设为null,Unity会再次抛出此异常。
}
Log(ref sb, "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 运行时间:{0} 毫秒", sw.ElapsedMilliseconds.ToString());

sb.Insert(0, System.Environment.NewLine);
if (retvalue.Exception == null)
{
VirtualRemote.Common.Info(sb.ToString());
}
else
{
VirtualRemote.Common.Error(sb.ToString());
}
return retvalue;
}

public static string GetObjectString(object value)
{
if (value==null)
{
return "null";
}
if (value is string)
{
}
else if (value.GetType().IsClass)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(value);
}
return value.ToString();
}

}

}

以前写的一段aop,远程接口调用的日志。的更多相关文章

  1. HttpClient远程接口调用-实名认证

    1.HttpClient远程接口调用 1)用户注册 注册按钮button提交表单时,要return false form表单 <!-- action="http://localhost ...

  2. SmartRoute之远程接口调用和负载

    基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性.为了让SmartRoute更适合业务应用集成,在新的一年开始SmartRoute集成了远程接口 ...

  3. HttpClient 远程接口调用方式

    远程接口调用方式HttpClient 问题:现在我们已经开发好了接口了,那该如何调用这个接口呢? 答:使用Httpclient客户端.   Httpclient简介 什么是httpclient Htt ...

  4. 【RPC】远程接口调用实例 的几种方式比较

    pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...

  5. RMI(远程接口调用)

    1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传输层(Transport ...

  6. java之远程接口调用

    一.通过地址栏传值 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...

  7. SpringBoot远程接口调用-RestTemplate使用

    在web服务中,调度远程url是常见的使用场景,最初多采用原生的HttpClient,现采用Spring整合的RestTemplate工具类进行.实操如下: 1. 配置 主要用以配置远程链接的相关参数 ...

  8. [go]grpc远程接口调用实现

    // grpc序列化/反序列化成对应语言的对象 // 1.写idl(数据类型+方法) // 2.生成对应语言的序列化/反序列化代码 // 3.方法需要自己实现 // 环境(将gopath/bin加入p ...

  9. .Net core使用XRPC创建远程接口的Actor对象

    Actor是一种高并发处理模型,每个Actor都有着自己的状态有序消息处理机制,所以在业务处理的情况并不需要制定锁的机制,从而达到更高效的处理能性.XRPC是一个基于远程接口调用的RPC组件,它可以简 ...

随机推荐

  1. 基于Kubernetes在AWS上部署Kafka时遇到的一些问题

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 交代一下背景:我们的后台系统是一套使用Kafka消息队列的数据处理管线 ...

  2. 序列化笔记之一:Google的Protocol Buffer格式分析

    从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作为一个学了多年通信的人,ProtocolBuffer在我看来是一种信源编码.所谓信 ...

  3. 详解this

    this 虐我千百遍,看完此文效立见!不得不说,这篇文章的总结很地道很全面,适合收藏之用. 原文:all this 习惯了高级语言的你或许觉得JavaScript中的this跟Java这些面向对象语言 ...

  4. 「标准」的 JS风格

    首先,这份 JS风格指南已经在我司的前端团队实行半年多了: 其次,在程序员的世界里,从入行到资深都需要面对几个世界级的难题,如: 世界上最好的编辑器是什么? 是用空格还是 TAB?用空格还特么衍生出 ...

  5. 气泡 弹出 bootstrap-popover的配置与灵活应用

    <script src="/assets/addons/bootstrap-select/bootstrap-select.min.js"></script> ...

  6. 【Win10 应用开发】集成文件打开选择器

    有朋友给老周提出建议:老周,能不能在写博客时讲一下有深度的小故事?技术文章谁不会写.讲一下对人生有启发性的故事会更好. 哎呀,这要求真是越来越高了.好吧,尽量吧,如果有小故事的话,老周在就每次写博客时 ...

  7. 基本数据结构(2)——算法导论(12)

    1. 引言     这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍      我们在上一篇中提过,栈与队 ...

  8. 如何在博客中使用SublimeText风格的代码高亮样式

    因为觉得博客园自带的代码高亮样式很单一,不符合作为前端的我的审美习惯,于是下定决心要想办法折腾出一个方法来应用上另外一套代码高亮样式. 虽然探索的过程是很痛苦的,但最后还是成功了,但也不枉付出的那些努 ...

  9. 在Windows上安装Elasticsearch 5.0

    在windows上安装Elasticsearch Elasticsearch可以使用.zip软件包安装在Windows上. elasticsearch-service.bat命令,它将设置Elasti ...

  10. 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布

    一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...