Dynamic CRM插件中记录日志的方式有多种 通常情况下分为ITracingService记录、单独日志表插入记录、文本记录三种。
之前整理过ITracingService记录的方式,但这种记录有限制,只有存在异常时才会在插件跟踪日志中查到,异常报错时排查问题到可以,但插件详细的日志记录查看就不很方便,并且插件跟踪日志中记录到最上层的插件,直接通过插件名查询不方便。
 
单独日志表的方式,也很简单,自定义一个日志表,在插件中调用封装好的日志插入方法即可,但这个存在一个致命的问题,像是普通的信息记录没问题,若存在异常,插入操作会回滚,所以无法通过这种记录排查异常。
 
第三种文本记录,需要引用第三方组件,比如Nlog或者Lognet4,我使用的Nlog
Nlog日志记录单例类早就有封装,可以在插件程序集中直接引用过来,最核心的地方就是Nlog的config文件,在插件程序集中不需要单独放置一份NLog.config,只需要在CRM的应用服务的Dynamics 365\CRMWeb\bin文件夹中放置好即可,并且保证CRMWeb里bin中的NLog.dll与插件程序集中引用的版本一致
提示:

1.通常服务器上CRMWeb路径为:C:\Program Files\Dynamics 365\CRMWeb\bin
2.NLog.config中具体指明一下文件存放的路径
 

附上NLog帮助类和服务器上NLog.config配置:
  1     /// <summary>
2 /// Nlog日志帮助类
3 /// </summary>
4 public class LoggerHelper
5 {
6 #region 单例模式
7 private LoggerHelper()
8 {
9 }
10 private static readonly object LockObj = new object();
11 private static LoggerHelper _instance;
12
13 /// <summary>
14 /// 获得对象实例
15 /// </summary>
16 public static LoggerHelper Instance
17 {
18 get
19 {
20 lock (LockObj)
21 {
22 if (_instance == null)
23 {
24 _instance = new LoggerHelper();
25 }
26 return _instance;
27 }
28 }
29 }
30
31 #endregion 单例模式
32
33 #region 属性
34
35 private Logger _log;
36 /// <summary>
37 /// 日志实例
38 /// </summary>
39 public Logger Log
40 {
41 get
42 {
43 if (_log == null) _log = LogManager.GetCurrentClassLogger();
44 return _log;
45 }
46 private set { _log = value; }
47 }
48 #endregion 属性
49
50 #region 方法
51
52 #region 普通方式
53 public void Debug(string msg)
54 {
55 Log.Debug(msg);
56 }
57 public void Debug(string msg, params object[] args)
58 {
59 Log.Debug(msg, args);
60 }
61 public void Debug(string msg, Exception ex)
62 {
63 Log.Debug(ex, msg);
64 }
65 public void Warn(string msg)
66 {
67 Log.Warn(msg);
68 }
69 public void Warn(string msg, params object[] args)
70 {
71 Log.Warn(msg, args);
72 }
73 public void Warn(string msg, Exception ex)
74 {
75 Log.Warn(ex, msg);
76 }
77 public void Trace(string msg)
78 {
79 Log.Trace(msg);
80 }
81 public void Trace(string msg, params object[] args)
82 {
83 Log.Trace(msg, args);
84 }
85 public void Trace(string msg, Exception ex)
86 {
87 Log.Trace(ex, msg);
88 }
89 public void Fatal(string msg, params object[] args)
90 {
91 Log.Fatal(msg, args);
92 }
93
94 public void Fatal(string msg, Exception ex)
95 {
96 Log.Fatal(ex, msg);
97 }
98 #endregion 普通方式
99
100 #region 运行时日志
101 /// <summary>
102 /// 运行时日志
103 /// </summary>
104 /// <param name="msg">记录的信息</param>
105 public void Info(string msg)
106 {
107 LogEventInfo logInfo = SetCustomInfo(LogLevel.Info, "Runlog", msg);
108 Log.Log(LogLevel.Info, logInfo);
109 }
110 #endregion 运行时日志
111
112 #region 错误日志
113 /// <summary>
114 /// 错误记录
115 /// </summary>
116 /// <param name="msg">方法名</param>
117 /// <param name="ex">异常</param>
118 public void Error(string msg)
119 {
120 LogEventInfo logInfo = SetCustomInfo(LogLevel.Error, "ExceptionLogger", msg);
121 logInfo.Properties["ErrorHead"] = "程序发生错误:";
122 Log.Log(LogLevel.Error, logInfo);
123 }
124 /// <summary>
125 /// 错误记录
126 /// </summary>
127 /// <param name="msg">方法名</param>
128 /// <param name="ex">异常</param>
129 public void Error(string msg, Exception ex)
130 {
131 LogEventInfo logInfo = SetCustomInfo(LogLevel.Error, "ExceptionLogger", msg);
132 logInfo.Properties["ErrorHead"] = "程序发生错误:";
133 logInfo.Exception = ex;
134 Log.Log(LogLevel.Error, logInfo);
135 }
136 #endregion 错误日志
137
138 #region 私有方法
139 /// <summary>
140 /// 设置自定义日志事件
141 /// </summary>
142 /// <param name="level"></param>
143 /// <param name="loggerName"></param>
144 /// <param name="message"></param>
145 /// <param name="customPropertie"></param>
146 /// <param name="customPropertieValue"></param>
147 /// <returns></returns>
148 private LogEventInfo SetCustomInfo(LogLevel level, string loggerName, string message, string customPropertie = "", string customPropertieValue = "")
149 {
150 LogEventInfo ei = new LogEventInfo(level, loggerName, message); //也可以用LogEventInfo.Create(level, loggerName, message);
151 if (!string.IsNullOrEmpty(customPropertie) && !string.IsNullOrEmpty(customPropertieValue))
152 ei.Properties[customPropertie] = customPropertieValue;
153 return ei;
154
155 }
156 #endregion 私有方法
157
158 #endregion 方法
NLog.config配置:
 1 <?xml version="1.0" encoding="utf-8" ?>
2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
5 autoReload="true">
6
7 <!-- Use below one for debugging-->
8 <!--nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
9 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10 xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
11 autoReload="true"
12 throwExceptions="true"
13 internalLogLevel="Trace"
14 internalLogFile="c:\temp\nlog-internal.log"-->
15
16 <extensions>
17 <add assembly="Microsoft.Xrm.Log"/>
18 </extensions>
19
20 <variable name="floderInfo" value="Info"/>
21 <variable name="floderError" value="Error"/>
22
23 <targets>
24 <target name="XrmTraceETWTarget" xsi:type="XrmTraceETWTarget" />
25
26 <target name="DataProviderExecutionETWTarget" xsi:type="DataProviderExecutionETWTarget" />
27 <!-- ${basedir} -->
28 <target name="XrmTraceFileTarget" xsi:type="File"
29 layout="${longdate}|${logger}|${level:uppercase=true}|${message}|${all-event-properties}|${exception:format=tostring}"
30 fileName="D:/CrmLog/logs/logfile.txt"
31 archiveFileName="D:/CrmLog/archives/log.{#####}.txt"
32 archiveAboveSize="1024000"
33 archiveNumbering="Sequence"
34 concurrentWrites="true"
35 keepFileOpen="false"
36 encoding="utf-8" />
37 <!-- ${basedir} -->
38 <target name="debug_info_file" xsi:type="File"
39 layout="${longdate}|${logger}|${level:uppercase=true}|${message}|${all-event-properties}|${exception:format=tostring}"
40 fileName="D:/CrmLog/logs/${floderInfo}/${shortdate}.txt"
41 archiveFileName="D:/CrmLog/archives/${shortdate}.{#####}.txt"
42 archiveAboveSize="1024000"
43 archiveNumbering="Sequence"
44 concurrentWrites="true"
45 keepFileOpen="false"
46 encoding="utf-8" />
47 <!--错误记录 开始-->
48 <target name="error_file" xsi:type="File"
49 layout="${newline}${longdate} ${level:uppercase=true} ${event-context:item=ErrorHead}${newline} ${message} 发生异常: ${onexception:${exception:format=tostring} ${newline} 堆栈信息为: ${stacktrace} ${newline}------------------------------------ "
50 fileName="D:/CrmLog/Logs/${floderError}/${shortdate}.txt"
51 archiveFileName="D:/CrmLog/archives/${floderError}/${shortdate}.{#####}.txt"
52 archiveAboveSize="1024000"
53 archiveNumbering="Sequence"
54 concurrentWrites="true"
55 keepFileOpen="false"
56 encoding="utf-8"/>
57 <!--错误记录 结束-->
58 </targets>
59
60
61
62 <rules>
63 <!-- Add custom rule here -->
64 <logger name="Microsoft.Xrm.DataProvider*" minLevel="Debug" writeTo="DataProviderExecutionETWTarget" final="true"/>
65 <logger name="Microsoft.Xrm.DataPipeline" minLevel="Debug" writeTo="DataProviderExecutionETWTarget" final="true"/>
66 <logger name="*" minLevel="Debug" writeTo="debug_info_file" />
67 <logger name="*" levels="Error" writeTo="error_file" />
68
69 <!-- Add default XrmTrace logging rule "*" here if you want to override in production-->
70
71 </rules>
72 </nlog>
 
 
 
 
 
 

Dynamic CRM插件中记录日志-Nlog记录到文本的更多相关文章

  1. Dynamic CRM插件调试与单元测试

    背景 使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dyn ...

  2. Dynamic CRM 2013学习笔记(二)插件基本用法及调试

      插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可 ...

  3. Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能

    前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...

  4. .NET中使用NLog记录日志

    以前小编记录日志使用的是Log4Net,虽然好用但和NLog比起来稍显复杂.下面小编就和大伙分享一下NLog的使用方式. 引用NLog.Config 在使用NLog之前,我们要首先添加对NLog.Co ...

  5. Dynamic CRM 2013学习笔记(一)插件输入实体参数解析

      1. 问题描述 最近新建了一个post事件的插件,传入的参数处理如下: 1: if (context.InputParameters.Contains("Target") &a ...

  6. Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具

    基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的 ...

  7. Dynamic CRM 2013学习笔记(十四)复制/克隆记录

    经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...

  8. [转]asp.net5中使用NLog进行日志记录

    本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...

  9. asp.net5中使用NLog进行日志记录

    asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...

随机推荐

  1. SAP BOM 笔记(本文仅作笔记使用,非原创)

    SAP各种BOM汇总--含义解释(简洁易懂)-转载(原文连接:http://blog.sina.com.cn/s/blog_b9137f430102xpam.html)感谢作者分享     订单BOM ...

  2. SAP 日期计算

    1. CONVERSION_EXIT_IDATE_OUTPUT     INPUT:      20200601     OUTPUT:   03FEB2008 2. CONVERT_DATE_TO_ ...

  3. 【RPA之家转载RPA创新产业峰会回看】机器人流程自动化专利态势报告

    [RPA之家转载RPA创新产业峰会回看]机器人流程自动化专利态势报告 自动化的一个专利情况的监测,就是全球监测的情况.今天我可能给大家汇报的主要是三个方面,第一个方面就是讲一下全球投资智能化的专利的一 ...

  4. VisionPro · C# · 加载与保存视觉工具包

    当项目程序被启动或更换程序产品型号时,我们需要提前加载对应的VisionPro的程序VPP文件,以提高程序调用效率. 加载代码: 1 using System; 2 using System.Wind ...

  5. python——进行年龄和性别检测

    年龄和性别检测 使用Python编程语言带你完成使用机器学习进行年龄和性别检测的任务. 首先需要编写用于检测人脸的代码,因为如果没有人脸检测,我们将无法进一步完成年龄和性别预测的任务. 下一步是预测图 ...

  6. NC24840 [USACO 2009 Mar S]Look Up

    NC24840 [USACO 2009 Mar S]Look Up 题目 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenient ...

  7. NC20276 [SCOI2010]传送带

    NC20276 [SCOI2010]传送带 题目 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD ...

  8. Elasticsearch学习系列七(Es分布式集群)

    核心概念 集群(Cluster) 一个Es集群由多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识 节点(Node) 一个Es实例就是一个Node.Es的配置文件中可以通过node.ma ...

  9. 【cartographer_ros】七: 主要配置参数说明

    上一节介绍了路标Landmark数据的订阅和发布,各类数据的发布和订阅基本阐述完毕. 本节会介绍cartographer的主要配置参数,研究这些参数的使用和对算法的影响. 目录 1,map_build ...

  10. 渗透测试(PenTest)基础指南

    什么是渗透测试? 渗透测试(Penetration Test,简称为 PenTest),是指通过尝试利用漏洞攻击来评估IT基础设施的安全性.这些漏洞可能存在于操作系统.服务和应用程序的缺陷.不当配置或 ...