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 ///
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 ///
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 ///
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 ///
104 /// 记录的信息
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 ///
116 /// 方法名
117 /// 异常
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 ///
127 /// 方法名
128 /// 异常
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 ///
142 ///
143 ///
144 ///
145 ///
146 ///
147 ///
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
2
手机扫一扫
移动阅读更方便
你可能感兴趣的文章