经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
NLog组件
来源:cnblogs  作者:势不可挡  时间:2018/11/11 10:44:42  对本文有异议

接触.net项目的同志们都清楚,最初在项目中记录日志常用的是log4net日志组件,随着.net框架的不对优化升级,最近新流行的日志框架nlog,下面我就对nlog组件说说自己的认知:

下载

通过Nuget安装NLog

 

 配置

在项目根目录下新建一个NLog.config(在Nuget包中也可以下载NLog.config包,下载默认的位置是C盘,可能和你的工程不在同一个文件夹,不建议使用),基本目录结构:targets下面配置日志输出目标及相关参数,rules下面配置目标输出规则:

  1. 1 <?xml version="1.0" ?>
  2. 2 <nlog>
  3. 3 <targets>
  4. 4 <target></target>
  5. 5 <target></target>
  6. 6 </targets>
  7. 7 <rules>
  8. 8 <logger></logger>
  9. 9 <logger></logger>
  10. 10 </rules>
  11. 11 </nlog>
NLog.config

记得在NLog.config的属性中设置 Copy to Output Directory: Copy always,作用是每次重新生成解决方案的时候都会将改配置文件复制的本地目录,否则本地找不到配置文件无法将日志记录到文件中:

完整的配置文件如下,日志配置文件尽量单独创建一个文件:

  1. 1 <?xml version="1.0" encoding="utf-8" ?>
  2. 2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  3. 3 <targets>
  4. 4 <!--写入文件-->
  5. 5 <target xsi:type="File" name="DebugFile" fileName="Logs\Debug\${shortdate}.log"
  6. 6 layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
  7. 7 </target>
  8. 8 <target xsi:type="File" name="InfoFile" fileName="Logs\Info\${shortdate}.log"
  9. 9 layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
  10. 10 </target>
  11. 11 <target xsi:type="File" name="ErrorFile" fileName="Logs\Error\${shortdate}.log"
  12. 12 layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
  13. 13 </target>
  14. 14
  15. 15 <target xsi:type="Database" name="NewDatabase" >
  16. 16 <dbProvider>System.Data.SqlClient</dbProvider>
  17. 17 <connectionString>
  18. 18 Data Source=127.0.0.1;Initial Catalog=FlightAnalysis;Persist Security Info=true;User ID=sa;Password=111111;
  19. 19 </connectionString>
  20. 20 <commandText>
  21. 21 insert into OperatorLog(Id,AppName,ModuleName,ProcName,OperationType,Logger,LogMessage,IP,UserName,LogLevel)
  22. 22 <!--values(@Id,'','','',0,'','','','','',getdate())-->
  23. 23 values(@Id,@AppName,@ModuleName,@ProcName,@OperationType,@Logger,@LogMessage,@IP,@UserName,@LogLevel)
  24. 24 </commandText>
  25. 25 <parameter name="@Id" layout="${event-context:item=Id}" />
  26. 26 <parameter name="@AppName" layout="${event-context:item=AppName}" />
  27. 27 <parameter name="@ModuleName" layout="${event-context:item=ModuleName}" />
  28. 28 <parameter name="@ProcName" layout="${event-context:item=ProcName}" />
  29. 29 <parameter name="@OperationType" layout="${event-context:item=OperationType}" />
  30. 30 <parameter name="@Logger" layout="${event-context:item=Logger}" />
  31. 31 <parameter name="@LogMessage" layout="${event-context:item=LogMessage}" />
  32. 32 <parameter name="@IP" layout="${event-context:item=IP}" />
  33. 33 <parameter name="@Longdate" layout="${event-context:item=Longdate}" />
  34. 34 <parameter name="@UserName" layout="${event-context:item=UserName}" />
  35. 35 <parameter name="@Createdate" layout="${longdate}" />
  36. 36 <parameter name="@LogLevel" layout="${level}" />
  37. 37 </target>
  38. 38 </targets>
  39. 39
  40. 40 <rules>
  41. 41 <!--根据日志级别分别写文件,也可以放一个文件中-->
  42. 42 <!--<logger name="DbLogger" levels="Debug,Info,Error" writeTo="MyFile" />-->
  43. 43 <logger name="MyLogger" level="Debug" writeTo="DebugFile" />
  44. 44 <logger name="MyLogger" level="Info" writeTo="InfoFile" />
  45. 45 <logger name="MyLogger" level="Error" writeTo="ErrorFile" />
  46. 46 <!--写数据库-->
  47. 47 <logger name="MyLogger" levels="Trace,Debug,Info,Error" writeTo="NewDatabase"/>
  48. 48 </rules>
  49. 49 </nlog>
NLog.config
  • 如在根节点(nlog)配置 internalLogLevel, internalLogFile,可以查看NLog输出日志时的内部信息,比如你配置文件有错误,很有帮助,不过项目发布后还是关闭比较好,以免影响效率;
  • 在target外面罩了一个 <target>并且xsi:type为 AsyncWrapper,即表示这条 target 将异步输出,这里我将文件和数据库日志异步输出;
  • db target内指定了数据库连接字符串 connectionString,SQL语句,SQL参数,还可以指定数据库/表创建和删除的脚本(推荐看NLog源码示例,这里不介绍),同时我们自定义了2个参数 action和amount;
  • target参数里有些是NLog内置参数,比如message,level,date,longdate,exception,stacktrace等,NLog在输出时会自动赋值;
  • layout设置了每条日志的格式;
  • 在rules节点,我们分别指定了三个target输出日志的级别,NLog 用于输出日志的级别包括:Trace,Debug,Info,Warn,Error,Fatal,可以设置 minlevel设置最小级别,也可以用 levels定义你所有需要的级别(多个用逗号分隔)。
  • event-context代表自定义的参数。

路由规则(Rules)

   <rules />区域定义了日志的路由规则。每一个路由表项就是一个<logger />元素。<logger />有以下属性:

  1. name - 日志源/记录者的名字 (允许使用通配符*)
  2. minlevel - 该规则所匹配日志范围的最低级别
  3. maxlevel - 该规则所匹配日志范围的最高级别
  4. level - 该规则所匹配的单一日志级别
  5. levels - 该规则所匹配的一系列日志级别,由逗号分隔。
  6. writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。
  7. final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行

封装

对NLog.config的Logger进行简单封装:

  1. 1 /// <summary>
  2. 2 /// 日志类,只提供接口
  3. 3 /// 2018-11-6 15:32:01
  4. 4 /// </summary>
  5. 5 public class Logger
  6. 6 {
  7. 7 #region 初始化
  8. 8 //获取指定的名称为logger。
  9. 9 //private static NLog.Logger _dblogger = NLog.LogManager.GetLogger("MyLogger");
  10. 10 /// <summary>
  11. 11 /// 日事件间类
  12. 12 /// </summary>
  13. 13 private LogEventInfo lei = new LogEventInfo();
  14. 14 /// <summary>
  15. 15 /// 数据错误无法获取用户时使用
  16. 16 /// </summary>
  17. 17 public static string DefaultUser = "system";
  18. 18 /// <summary>
  19. 19 /// 默认IP地址
  20. 20 /// </summary>
  21. 21 public static string DefaultIP = "127.0.0.1";
  22. 22 /// <summary>
  23. 23 /// 提供日志接口和实用程序功能
  24. 24 /// </summary>
  25. 25 private NLog.Logger _logger = null;
  26. 26 /// <summary>
  27. 27 /// 自定义日志对象供外部使用
  28. 28 /// </summary>
  29. 29 public static Logger Default { get; private set; }
  30. 30
  31. 31 private Logger(NLog.Logger logger)
  32. 32 {
  33. 33 _logger = logger;
  34. 34 }
  35. 35 public Logger(string name) : this(LogManager.GetLogger(name))
  36. 36 { }
  37. 37
  38. 38 static Logger()
  39. 39 {
  40. 40 //获取具有当前类名称的日志程序。
  41. 41 Default = new Logger("MyLogger");
  42. 42 }
  43. 43 #endregion
  44. 44
  45. 45 #region Debug
  46. 46 public void Debug(string msg, params object[] args)
  47. 47 {
  48. 48 _logger.Debug(msg, args);
  49. 49 }
  50. 50
  51. 51 public void Debug(string msg, Exception err)
  52. 52 {
  53. 53 _logger.Debug(err, msg);
  54. 54 }
  55. 55 #endregion
  56. 56
  57. 57 #region Info
  58. 58 public void Info(string msg, params object[] args)
  59. 59 {
  60. 60 _logger.Info(msg, args);
  61. 61 }
  62. 62
  63. 63 public void Info(string msg, Exception err)
  64. 64 {
  65. 65 _logger.Info(err, msg);
  66. 66 }
  67. 67 #endregion
  68. 68
  69. 69 #region Warn
  70. 70 /// <summary>
  71. 71 ///警告
  72. 72 /// </summary>
  73. 73 /// <param name="msg">警告信息</param>
  74. 74 /// <param name="args">动态参数</param>
  75. 75 public void Warn(string msg, params object[] args)
  76. 76 {
  77. 77 _logger.Warn(msg, args);
  78. 78 }
  79. 79 /// <summary>
  80. 80 ///警告
  81. 81 /// </summary>
  82. 82 /// <param name="msg">警告信息</param>
  83. 83 /// <param name="err">异常信息</param>
  84. 84 public void Warn(string msg, Exception err)
  85. 85 {
  86. 86 _logger.Warn(err, msg);
  87. 87 }
  88. 88 #endregion
  89. 89
  90. 90 #region Trace
  91. 91 /// <summary>
  92. 92 /// 使用指定的参数在跟踪级别写入诊断消息
  93. 93 /// </summary>
  94. 94 /// <param name="msg">跟踪信息</param>
  95. 95 /// <param name="args">动态参数</param>
  96. 96 public void Trace(string msg, params object[] args)
  97. 97 {
  98. 98 _logger.Trace(msg, args);
  99. 99 }
  100. 100 /// <summary>
  101. 101 /// 使用指定的参数在跟踪级别写入诊断消息
  102. 102 /// </summary>
  103. 103 /// <param name="msg">跟踪信息</param>
  104. 104 /// <param name="args">异常信息</param>
  105. 105 public void Trace(string msg, Exception err)
  106. 106 {
  107. 107 _logger.Trace(err, msg);
  108. 108 }
  109. 109 #endregion
  110. 110
  111. 111 #region Error
  112. 112 /// <summary>
  113. 113 /// 使用指定的参数在错误级别写入诊断消息。
  114. 114 /// </summary>
  115. 115 /// <param name="msg">错误信息</param>
  116. 116 /// <param name="args">动态参数</param>
  117. 117 public void Error(string msg, params object[] args)
  118. 118 {
  119. 119 _logger.Error(msg, args);
  120. 120 }
  121. 121 /// <summary>
  122. 122 /// 使用指定的参数在错误级别写入诊断消息。
  123. 123 /// </summary>
  124. 124 /// <param name="msg">错误信息</param>
  125. 125 /// <param name="args">异常信息</param>
  126. 126 public void Error(string msg, Exception err)
  127. 127 {
  128. 128 _logger.Error(err, msg);
  129. 129 }
  130. 130 #endregion
  131. 131
  132. 132 #region Fatal
  133. 133 /// <summary>
  134. 134 /// 使用指定的参数在致命级别写入诊断消息。
  135. 135 /// </summary>
  136. 136 /// <param name="msg">致命错误</param>
  137. 137 /// <param name="args">动态参数</param>
  138. 138 public void Fatal(string msg, params object[] args)
  139. 139 {
  140. 140 _logger.Fatal(msg, args);
  141. 141 }
  142. 142 /// <summary>
  143. 143 /// 使用指定的参数在致命级别写入诊断消息。
  144. 144 /// </summary>
  145. 145 /// <param name="msg">致命错误</param>
  146. 146 /// <param name="args">异常信息</param>
  147. 147 public void Fatal(string msg, Exception err)
  148. 148 {
  149. 149 _logger.Fatal(err, msg);
  150. 150 }
  151. 151 /// <summary>
  152. 152 /// 刷新所有挂起的日志消息(在异步目标的情况下)。
  153. 153 /// </summary>
  154. 154 /// <param name="timeoutMilliseconds">最大的时间允许冲洗。此后的任何消息都将被丢弃。</param>
  155. 155 public void Flush(int? timeoutMilliseconds = null)
  156. 156 {
  157. 157 if (timeoutMilliseconds != null)
  158. 158 NLog.LogManager.Flush(timeoutMilliseconds.Value);
  159. 159
  160. 160 NLog.LogManager.Flush();
  161. 161 }
  162. 162 #endregion
  163. 163
  164. 164
  165. 165 #region Operator日志写入
  166. 166 /// <summary>
  167. 167 /// 写入日志信息
  168. 168 /// </summary>
  169. 169 /// <param name="operatorLogModel">操作信息</param>
  170. 170 public void InsOperatorLog(OperatorLogModel operatorLogModel)
  171. 171 {
  172. 172 var level = LogLevel.Info;
  173. 173 if (operatorLogModel.LogLevel == NLog.LogLevel.Trace)
  174. 174 level = LogLevel.Trace;
  175. 175 else if (operatorLogModel.LogLevel == NLog.LogLevel.Debug)
  176. 176 level = LogLevel.Debug;
  177. 177 else if (operatorLogModel.LogLevel == NLog.LogLevel.Info)
  178. 178 level = LogLevel.Info;
  179. 179 else if (operatorLogModel.LogLevel == NLog.LogLevel.Warn)
  180. 180 level = LogLevel.Warn;
  181. 181 else if (operatorLogModel.LogLevel == NLog.LogLevel.Error)
  182. 182 level = LogLevel.Error;
  183. 183 else if (operatorLogModel.LogLevel == NLog.LogLevel.Fatal)
  184. 184 level = LogLevel.Fatal;
  185. 185
  186. 186 if (operatorLogModel.LogMessage.Length > 3000)
  187. 187 {
  188. 188 operatorLogModel.LogMessage = operatorLogModel.LogMessage.Substring(0, 3000);
  189. 189 }
  190. 190 lei.Properties["Id"] = Guid.NewGuid().ToString("D");
  191. 191 lei.Properties["AppName"] = operatorLogModel.AppName;
  192. 192 lei.Properties["ModuleName"] = operatorLogModel.ModuleName;
  193. 193 lei.Properties["ProcName"] = operatorLogModel.ProcName;
  194. 194 lei.Properties["OperationType"] = operatorLogModel.OperationType;
  195. 195 lei.Properties["Logger"] = operatorLogModel.Logger;
  196. 196 lei.Properties["LogMessage"] = operatorLogModel.LogMessage;
  197. 197 lei.Properties["IP"] = operatorLogModel.IP ?? DefaultIP;
  198. 198 lei.Properties["Longdate"] = operatorLogModel.Longdate;
  199. 199 lei.Properties["UserName"] = operatorLogModel.UserName ?? DefaultUser;
  200. 200 lei.Properties["Createdate"] = operatorLogModel.Createdate;
  201. 201 lei.Level = operatorLogModel.LogLevel;
  202. 202 _logger.Log(level, lei);
  203. 203 }
  204. 204 #endregion
  205. 205 }
Logger

对操作类型进行简单封装,也可以自定义:

  1. 1 /// <summary>
  2. 2 /// 操作类型枚举
  3. 3 /// </summary>
  4. 4 public enum OperationType
  5. 5 {
  6. 6 /// <summary>
  7. 7 /// 保存或添加
  8. 8 /// </summary>
  9. 9 [System.ComponentModel.Description("添加")]
  10. 10 ADD,
  11. 11 /// <summary>
  12. 12 /// 更新
  13. 13 /// </summary>
  14. 14 [System.ComponentModel.Description("更新")]
  15. 15 UPDATE,
  16. 16 /// <summary>
  17. 17 /// 核销
  18. 18 /// </summary>
  19. 19 [System.ComponentModel.Description("核销")]
  20. 20 AUDIT,
  21. 21 /// <summary>
  22. 22 /// 查看
  23. 23 /// </summary>
  24. 24 [System.ComponentModel.Description("指派")]
  25. 25 ASSIGN,
  26. 26 /// <summary>
  27. 27 /// 删除
  28. 28 /// </summary>
  29. 29 [System.ComponentModel.Description("删除")]
  30. 30 DELETE,
  31. 31 /// <summary>
  32. 32 /// 读取/查询
  33. 33 /// </summary>
  34. 34 [System.ComponentModel.Description("查询")]
  35. 35 RETRIEVE,
  36. 36 /// <summary>
  37. 37 /// 登录
  38. 38 /// </summary>
  39. 39 [System.ComponentModel.Description("登录")]
  40. 40 LOGIN,
  41. 41 /// <summary>
  42. 42 /// 查看
  43. 43 /// </summary>
  44. 44 [System.ComponentModel.Description("查看")]
  45. 45 LOOK
  46. 46 }
OperationType

自定义类,主要用于绑定数据:

  1. 1 /// <summary>
  2. 2 /// 操作日志类
  3. 3 /// </summary>
  4. 4 public class OperatorLogModel
  5. 5 {
  6. 6 /// <summary>
  7. 7 /// 自增主键ID
  8. 8 /// </summary>
  9. 9 public string Id { get; set; }
  10. 10 /// <summary>
  11. 11 /// 一级菜单
  12. 12 /// </summary>
  13. 13 public string AppName { get; set; }
  14. 14 /// <summary>
  15. 15 /// 二级菜单
  16. 16 /// </summary>
  17. 17 public string ModuleName { get; set; }
  18. 18 /// <summary>
  19. 19 /// 本级菜单
  20. 20 /// </summary>
  21. 21 public string ProcName { get; set; }
  22. 22 /// <summary>
  23. 23 /// 操作类型
  24. 24 /// </summary>
  25. 25 public int OperationType { get; set; }
  26. 26 /// <summary>
  27. 27 /// 日志文件
  28. 28 /// </summary>
  29. 29 public string Logger { get; set; }
  30. 30 /// <summary>
  31. 31 /// 日志信息
  32. 32 /// </summary>
  33. 33 public string LogMessage { get; set; }
  34. 34 /// <summary>
  35. 35 /// IP地址
  36. 36 /// </summary>
  37. 37 public string IP { get; set; }
  38. 38 /// <summary>
  39. 39 /// 记录时间
  40. 40 /// </summary>
  41. 41 public string Longdate { get; set; }
  42. 42 /// <summary>
  43. 43 /// 用户名称
  44. 44 /// </summary>
  45. 45 public string UserName { get; set; }
  46. 46 /// <summary>
  47. 47 /// 日志级别
  48. 48 /// </summary>
  49. 49 public NLog.LogLevel LogLevel { get; set; }
  50. 50 /// <summary>
  51. 51 /// 创建时间
  52. 52 /// </summary>
  53. 53 public DateTime Createdate { get; set; }
  54. 54 }
OperatorLogModel

创建数据库表,字段可以自定义,此处用的是SQL Server:

  1. 1 CREATE TABLE [dbo].[OperatorLog](
  2. 2 [Id] [varchar](60) NOT NULL,
  3. 3 [AppName] [varchar](20) NOT NULL,
  4. 4 [ModuleName] [varchar](30) NOT NULL,
  5. 5 [ProcName] [varchar](30) NOT NULL,
  6. 6 [OperationType] [int] NOT NULL,
  7. 7 [Logger] [varchar](500) NOT NULL,
  8. 8 [LogMessage] [varchar](3000) NOT NULL,
  9. 9 [IP] [varchar](32) NOT NULL,
  10. 10 [UserName] [varchar](36) NOT NULL,
  11. 11 [Createdate] [datetime] NOT NULL,
  12. 12 [LogLevel] [varchar](12) NOT NULL,
  13. 13 CONSTRAINT [PK_OperatorLog] PRIMARY KEY CLUSTERED
  14. 14 (
  15. 15 [Id] ASC
  16. 16 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  17. 17 ) ON [PRIMARY]
  18. 18
  19. 19 GO
  20. 20
  21. 21 SET ANSI_PADDING OFF
  22. 22 GO
  23. 23
  24. 24 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_Id] DEFAULT ('') FOR [Id]
  25. 25 GO
  26. 26
  27. 27 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_AppName] DEFAULT ('') FOR [AppName]
  28. 28 GO
  29. 29
  30. 30 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_ModuleName] DEFAULT ('') FOR [ModuleName]
  31. 31 GO
  32. 32
  33. 33 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_ProcName] DEFAULT ('') FOR [ProcName]
  34. 34 GO
  35. 35
  36. 36 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_OperationType] DEFAULT ((0)) FOR [OperationType]
  37. 37 GO
  38. 38
  39. 39 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_Logger] DEFAULT ('') FOR [Logger]
  40. 40 GO
  41. 41
  42. 42 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_LogMessage] DEFAULT ('') FOR [LogMessage]
  43. 43 GO
  44. 44
  45. 45 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_IP] DEFAULT ('') FOR [IP]
  46. 46 GO
  47. 47
  48. 48 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_UserName] DEFAULT ('') FOR [UserName]
  49. 49 GO
  50. 50
  51. 51 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF__OperatorL__creat__02084FDA] DEFAULT (getdate()) FOR [Createdate]
  52. 52 GO
  53. 53
  54. 54 ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_LogLevel] DEFAULT ('') FOR [LogLevel]
  55. 55 GO
  56. 56
  57. 57 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志表主键ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Id'
  58. 58 GO
  59. 59
  60. 60 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'一级菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'AppName'
  61. 61 GO
  62. 62
  63. 63 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'二级菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'ModuleName'
  64. 64 GO
  65. 65
  66. 66 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'本级菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'ProcName'
  67. 67 GO
  68. 68
  69. 69 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'OperationType'
  70. 70 GO
  71. 71
  72. 72 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志文件' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Logger'
  73. 73 GO
  74. 74
  75. 75 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志内容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'LogMessage'
  76. 76 GO
  77. 77
  78. 78 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'IP地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'IP'
  79. 79 GO
  80. 80
  81. 81 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'UserName'
  82. 82 GO
  83. 83
  84. 84 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Createdate'
  85. 85 GO
  86. 86
  87. 87 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志级别' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'LogLevel'
  88. 88 GO
[dbo].[OperatorLog]

引用日志如下:

  1. 1 public class Program
  2. 2 {
  3. 3 public static void Main(string[] args)
  4. 4 {
  5. 5 OperatorLogModel opModel = new OperatorLogModel();
  6. 6 opModel.AppName = "系统管理";
  7. 7 opModel.ModuleName = "权限管理";
  8. 8 opModel.ProcName = "用户管理";
  9. 9 opModel.OperationType = Convert.ToInt32(Enum.Parse(typeof(OperationType), OperationType.RETRIEVE.ToString()));
  10. 10 opModel.UserName = "ss";
  11. 11 //opModel.LogLevel = NLog.LogLevel.Trace;
  12. 12 opModel.Longdate = DateTime.Now.ToString();
  13. 13 opModel.Createdate = DateTime.Now;
  14. 14 opModel.Logger = "dfdfd";
  15. 15 opModel.LogMessage = "测试测试测试!!!";
  16. 16 Logger.Default.Error("dsfsfsfd");
  17. 17 //string ip = Request.HttpContext.Connection.RemoteIpAddress.ToString();
  18. 18
  19. 19 //Logger.Default.Info("就是这么霸气");
  20. 20
  21. 21 Logger.Default.InsOperatorLog(opModel);
  22. 22 CreateWebHostBuilder(args).Build().Run();
  23. 23 }
  24. 24
  25. 25 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  26. 26 WebHost.CreateDefaultBuilder(args)
  27. 27 .UseStartup<Startup>();
  28. 28 }
Program

数据库插入的操作日志结果如下:

文件中记录的日志如下:

 以上就是NLog日志组件的简单封装,欢迎纠错!!!

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号