Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!

关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me
还记得以前调试插件或者自定义工作流代码吗?如果是调试本机的代码还好,插件调试可以查考我这两篇博文:Dynamics CRM插件开发教程之:插件的调试 和 Dynamics 365 Customer Engagement中插件的调试 ,如果是调试非本机代码,需要使用远程调试,更麻烦。现在好多了,新增了一个名称为 PluginTraceLog 的实体,在插件或者自定义工作流中可以调用 ITracingService 服务来向这个实体写入数据,并且在CRM界面上可见,为了使用它,我们需要先开启,导航到 设置 > 管理 > 系统设置 > 自定义,可以看到有三个选项,默认是关闭,还有异常和所有两个选项,我这里先设置为 所有 来看看效果。
 
为了方便演示,我在罗勇测试实体的Post Update插件中监控了ownerid字段的变更,使用的插件代码如下:
protected void ExecutePostTestOwnerIdUpdate(LocalPluginContext localContext)
{
    if (localContext == null)
    {
        throw new ArgumentNullException("localContext");
    }

    // TODO: Implement your custom Plug-in business logic.
    localContext.TracingService.Trace("进入到PostTestOwnerIdAssign插件中的代码了!");
    IPluginExecutionContext context = localContext.PluginExecutionContext;
    var service = localContext.OrganizationService;
    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
    {
        Entity currentEntity = context.InputParameters["Target"] as Entity;
        localContext.TracingService.Trace(string.Format("新的OwnerId={0}", currentEntity.GetAttributeValue<EntityReference>("ownerid").Id));
        Entity annotationEntity = new Entity("annotation");
        annotationEntity["subject"] = "这是由注册在POSTOWNERIDUPDATE消息中的插件产生的!";
        annotationEntity["objectid"] = new EntityReference(currentEntity.LogicalName, currentEntity.Id);
        service.Create(annotationEntity);
    }
}
在Post Assign消息中也注册了插件,代码如下:
protected void ExecutePostTestAssign(LocalPluginContext localContext)
{
    if (localContext == null)
    {
        throw new ArgumentNullException("localContext");
    }

    // TODO: Implement your custom Plug-in business logic.
    localContext.TracingService.Trace("进入到PostTestAssign插件中的代码了!");
    IPluginExecutionContext context = localContext.PluginExecutionContext;
    var service = localContext.OrganizationService;
    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
    {

        Entity annotationEntity = new Entity("annotation");
        annotationEntity["subject"] = "这是由注册在POSTASSIGN消息中的插件产生的!";
        annotationEntity["objectid"] = context.InputParameters["Target"];
        if (context.InputParameters.Contains("Assignee") && context.InputParameters["Assignee"] is EntityReference)
        {
            localContext.TracingService.Trace(string.Format("新的OwnerId={0}", ((EntityReference)context.InputParameters["Assignee"]).Id));
        }
        service.Create(annotationEntity);
        throw new InvalidPluginExecutionException("罗勇故意抛出的异常!");
    }
}
我在界面上更改了记录的负责人在在 设置 > 插件跟踪日志 可以看到如下日志:
 
我打开消息名称为Assign的那个插件跟踪日志进去看看,触发的实体,配置,安全配置,消息名称,类型名称(执行代码的类名称),操作类型,模式,执行开始时间,执行持续时间都有,消息块里面记录了 TracingService.Trace 写入的消息。
 
 
如果插件中产生异常呢?我故意使用如下代码在PostTestAssign中抛出一个异常:

throw new InvalidPluginExecutionException("罗勇故意抛出的异常!");

界面如下所示:
 
查看插件日志就会有异常记录了,但是有两条:
 
打开一条PostTestAssign看看,在日志中的异常详细信息字段有如下的值,而PostTestOwnerIdUpdate的记录的异常详细信息字段则没有值。
 
这里值得一提的是,虽然Assign报错了,但是Update插件没有报错,所以记录的Update是成功了的,应该也是相当于更改了负责人的。
下面我们将系统设置中的启用插件跟踪日志的日志记录设置为 异常 ,就会只记录产生异常时候插件的日志消息。
 
更改记录负责人还是报错,但是记录下来的日志就少了,只有产生异常的Assign消息的日志了,没有产生异常的Update消息的日志没有了。
 
 
 

 
 
原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_CRM_2016_New_Feature_PluginTraceLog.html