Dynamic CRM插件中记录日志-Nlog记录到文本
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 方法
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记录到文本的更多相关文章
- Dynamic CRM插件调试与单元测试
背景 使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dyn ...
- Dynamic CRM 2013学习笔记(二)插件基本用法及调试
插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可 ...
- Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能
前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...
- .NET中使用NLog记录日志
以前小编记录日志使用的是Log4Net,虽然好用但和NLog比起来稍显复杂.下面小编就和大伙分享一下NLog的使用方式. 引用NLog.Config 在使用NLog之前,我们要首先添加对NLog.Co ...
- Dynamic CRM 2013学习笔记(一)插件输入实体参数解析
1. 问题描述 最近新建了一个post事件的插件,传入的参数处理如下: 1: if (context.InputParameters.Contains("Target") &a ...
- Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具
基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的 ...
- Dynamic CRM 2013学习笔记(十四)复制/克隆记录
经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...
- [转]asp.net5中使用NLog进行日志记录
本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...
- asp.net5中使用NLog进行日志记录
asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...
随机推荐
- CVPR2022 | A ConvNet for the 2020s & 如何设计神经网络总结
前言 本文深入探讨了如何设计神经网络.如何使得训练神经网络具有更加优异的效果,以及思考网络设计的物理意义. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟踪.经典论文解读.CV招聘 ...
- Node.js精进(3)——流
在 JavaScript 中,一般只处理字符串层面的数据,但是在 Node.js 中,需要处理网络.文件等二进制数据. 由此,引入了Buffer和Stream的概念,两者都是字节层面的操作. Buff ...
- Vue.js与Node.js一起打造一款属于自己的音乐App(收藏)
更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/118755888
- 从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)
前言 话不多说,这篇文章主要讲述如何从0到1搭建一款适用于Vue.js的自定义配置视频播放器.我们平时在PC端网站上观看视频时,会看到有很多丰富样式的视频播放器,而我们自己写的video标签样式却是那 ...
- SAP OOALV- 合计
TYPES: BEGIN OF ty_mara, srno LIKE adrc-name1, " Storing the total text matnr LIKE mara-matnr, ...
- 整理orcal常用sql语句
1.表插入列 alter table XMJ_ONE add column1 NUMBER(38) default 0;comment on column XMJ_ONE.column1 is '字段 ...
- RPA应用场景-账套建立
所涉人工数量5操作频率 不定时 场景流程 1.客户按照项目开设专项财务管理,每个项目需要在初期建立自己的账套: 2.运营专员通过邮件发送账套建立申请: 3.根据申请进入金蝶运维后台,依据规则完成账套建 ...
- Codeforces Round #789 (Div. 2) A-C
Codeforces Round #789 (Div. 2) A-C A 题目 https://codeforces.com/problemset/problem/1677/A 题解 思路 知识点:模 ...
- C++ 模板和泛型编程(掌握Vector等容器的使用)
1. 泛型 泛型在我的理解里,就是可以泛化到多种基本的数据类型,例如整数.浮点数.字符和布尔类型以及自己定义的结构体.而容器就是提供能够填充任意类型的数据的数据结构.例如vector就很类似于pyth ...
- 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC
摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ...