• Dynamic CRM插件中记录日志-Nlog记录到文本


    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     /// 
      2     /// Nlog日志帮助类
      3     /// 
      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         /// 
     14         /// 获得对象实例
     15         /// 
     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         /// 
     37         /// 日志实例
     38         /// 
     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         /// 
    102         /// 运行时日志 
    103         /// 
    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         /// 
    114         /// 错误记录
    115         /// 
    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         /// 
    125         /// 错误记录
    126         /// 
    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         /// 
    140         /// 设置自定义日志事件
    141         /// 
    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 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   
     8   
    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     
    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     
    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     
    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     
    70 
    71   rules>
    72 nlog>
    复制代码

     

     
     
     
     
     
     
  • 相关阅读:
    联邦学习: 联邦场景下的时空数据挖掘
    设计模式- 装饰器模式(Decorator Pattern)结构|原理|优缺点|场景|示例
    阿里十年总结,这份【Spring架构深度解析】已经被各大厂拿来当面试题了
    Linux线程同步实例
    uniapp 微信小程序如何实现多个item列表的分享
    【leetcode热题】分割回文串 II
    【STM32学习(4)】STM32简述定时器
    【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
    [计算机毕业设计定制]精品微信小程序学生公寓生活管理系统|前后分离VUE[包运行成功]
    若依微服务上传图片文件代理配置
  • 原文地址:https://www.cnblogs.com/adingfirstlove/p/16637754.html