一. 整合Log4net

1. 简单说明

  对于log4net 官方的程序集而言,从2.0.7开始就支持.Net Core了,这里我们采用的是2.0.8,虽然好久没更新了,但不影响使用。Core版本与普通的.Net版本下的使用方法非常类似,仅仅多了一步【创建日志仓储对象】CreateRepository而已,在实际框架封装中,建议把ILoggerRepository和ILog对象设置成单例的。

  .Net 版本的Log4Net参考:https://www.cnblogs.com/yaopengfei/p/9428206.html

2. 使用步骤

声明:【使用的是log4net官方程序集,MyLog02项目直接Nuget Log4net 程序集即可,使用的是该层中的Xml文件下的log4net.xml配置文件】

(1).通过Nuget安装【log4net 2.0.8】,并将log4net.xml配置文件拷贝到Xml文件夹下,将其生成操作改为“嵌入的资源”.

PS:log4net.xml文件与.Net版本下使用的一致,直接拷贝过来的,代码如下:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <!-- 一. 添加log4net的自定义配置节点-->
  4. <configSections>
  5. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  6. </configSections>
  7. <!--二. log4net的核心配置代码-->
  8. <log4net>
  9. <!--1. 输出途径(一) 将日志以回滚文件的形式写到文件中-->
  10.  
  11. <!--模式一:全部存放到一个文件夹里-->
  12. <appender name="log0" type="log4net.Appender.RollingFileAppender">
  13. <!--1.1 文件夹的位置(也可以写相对路径)-->
  14. <param name="File" value="D:\CoreLog\" />
  15. <!--相对路径-->
  16. <!--<param name="File" value="Logs/" />-->
  17. <!--1.2 是否追加到文件-->
  18. <param name="AppendToFile" value="true" />
  19. <!--1.3 使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件 -->
  20. <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  21. <!--1.4 配置Unicode编码-->
  22. <Encoding value="UTF-8" />
  23. <!--1.5 是否只写到一个文件里-->
  24. <param name="StaticLogFileName" value="false" />
  25. <!--1.6 配置按照何种方式产生多个日志文件 (Date:日期、Size:文件大小、Composite:日期和文件大小的混合方式)-->
  26. <param name="RollingStyle" value="Composite" />
  27. <!--1.7 介绍多种日志的的命名和存放在磁盘的形式-->
  28. <!--1.7.1 在根目录下直接以日期命名txt文件 注意&quot;的位置,去空格 -->
  29. <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />
  30. <!--1.7.2 在根目录下按日期产生文件夹,文件名固定 test.log -->
  31. <!--<param name="DatePattern" value="yyyy-MM-dd/&quot;test.log&quot;" />-->
  32. <!--1.7.3 在根目录下按日期产生文件夹,这是按日期产生文件夹,并在文件名前也加上日期 -->
  33. <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd&quot;-test.log&quot;" />-->
  34. <!--1.7.4 在根目录下按日期产生文件夹,这再形成下一级固定的文件夹 -->
  35. <!--<param name="DatePattern" value="yyyyMMdd/&quot;OrderInfor/test.log&quot;" />-->
  36. <!--1.8 配置每个日志的大小。【只在1.6 RollingStyle 选择混合方式与文件大小方式下才起作用!!!】可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志,
  37. 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。-->
  38. <param name="maximumFileSize" value="10MB" />
  39. <!--1.9 最多产生的日志文件个数,超过则保留最新的n个 将value的值设置-1,则不限文件个数 【只在1.6 RollingStyle 选择混合方式与文件大小方式下才起作用!!!】
  40. 与1.8中maximumFileSize文件大小是配合使用的-->
  41. <param name="MaxSizeRollBackups" value="5" />
  42. <!--1.10 配置文件文件的布局格式,使用PatternLayout,自定义布局-->
  43. <layout type="log4net.Layout.PatternLayout">
  44. <conversionPattern value="记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n%newline"/>
  45. </layout>
  46. </appender>
  47.  
  48. <!--模式二:分文件夹存放-->
  49. <!--文件夹1-->
  50. <appender name="log1" type="log4net.Appender.RollingFileAppender">
  51. <param name="File" value="D:\CoreLog\OneLog\" />
  52. <param name="AppendToFile" value="true" />
  53. <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  54. <Encoding value="UTF-8" />
  55. <param name="StaticLogFileName" value="false" />
  56. <param name="RollingStyle" value="Composite" />
  57. <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />
  58. <param name="maximumFileSize" value="10MB" />
  59. <param name="MaxSizeRollBackups" value="5" />
  60. <layout type="log4net.Layout.PatternLayout">
  61. <conversionPattern value="记录时间:%date %n错误描述:%message%newline %n%newline"/>
  62. </layout>
  63. <!--下面是利用过滤器进行分文件夹存放,两种过滤器进行配合-->
  64. <!--与Logger名称(OneLog)匹配,才记录,-->
  65. <filter type="log4net.Filter.LoggerMatchFilter">
  66. <loggerToMatch value="OneLog" />
  67. </filter>
  68. <!--阻止所有的日志事件被记录-->
  69. <filter type="log4net.Filter.DenyAllFilter" />
  70. </appender>
  71. <!--文件夹2-->
  72. <appender name="log2" type="log4net.Appender.RollingFileAppender">
  73. <param name="File" value="D:\CoreLog\TwoLog\" />
  74. <param name="AppendToFile" value="true" />
  75. <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  76. <Encoding value="UTF-8" />
  77. <param name="StaticLogFileName" value="false" />
  78. <param name="RollingStyle" value="Composite" />
  79. <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />
  80. <param name="maximumFileSize" value="10MB" />
  81. <param name="MaxSizeRollBackups" value="5" />
  82. <layout type="log4net.Layout.PatternLayout">
  83. <conversionPattern value="记录时间:%date %n错误描述:%message%newline %n%newline"/>
  84. </layout>
  85. <!--下面是利用过滤器进行分文件夹存放,两种过滤器进行配合-->
  86. <!--与Logger名称(TwoLog)匹配,才记录,-->
  87. <filter type="log4net.Filter.LoggerMatchFilter">
  88. <loggerToMatch value="TwoLog" />
  89. </filter>
  90. <!--阻止所有的日志事件被记录-->
  91. <filter type="log4net.Filter.DenyAllFilter" />
  92. </appender>
  93.  
  94. <!--2. 输出途径(二) 记录日志到数据库-->
  95. <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
  96. <!--2.1 设置缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
  97. <param name="BufferSize" value="1" />
  98. <!--2.2 引用-->
  99. <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  100. <!--2.3 数据库连接字符串-->
  101. <connectionString value="data source=localhost;initial catalog=LogDB;integrated security=false;persist security info=True;User ID=sa;Password=123456" />
  102. <!--2.4 SQL语句插入到指定表-->
  103. <commandText value="INSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (@threadId, @log_level, @log_name, @log_msg, @log_exception,@log_time)" />
  104. <!--2.5 数据库字段匹配-->
  105. <!-- 线程号-->
  106. <parameter>
  107. <parameterName value="@threadId" />
  108. <dbType value="String" />
  109. <size value="100" />
  110. <layout type="log4net.Layout.PatternLayout">
  111. <conversionPattern value="%thread" />
  112. </layout>
  113. </parameter>
  114. <!--日志级别-->
  115. <parameter>
  116. <parameterName value="@log_level" />
  117. <dbType value="String" />
  118. <size value="100" />
  119. <layout type="log4net.Layout.PatternLayout">
  120. <conversionPattern value="%level" />
  121. </layout>
  122. </parameter>
  123. <!--日志记录类名称-->
  124. <parameter>
  125. <parameterName value="@log_name" />
  126. <dbType value="String" />
  127. <size value="100" />
  128. <layout type="log4net.Layout.PatternLayout">
  129. <conversionPattern value="%logger" />
  130. </layout>
  131. </parameter>
  132. <!--日志信息-->
  133. <parameter>
  134. <parameterName value="@log_msg" />
  135. <dbType value="String" />
  136. <size value="5000" />
  137. <layout type="log4net.Layout.PatternLayout">
  138. <conversionPattern value="%message" />
  139. </layout>
  140. </parameter>
  141. <!--异常信息 指的是如Infor 方法的第二个参数的值-->
  142. <parameter>
  143. <parameterName value="@log_exception" />
  144. <dbType value="String" />
  145. <size value="2000" />
  146. <layout type="log4net.Layout.ExceptionLayout" />
  147. </parameter>
  148. <!-- 日志记录时间-->
  149. <parameter>
  150. <parameterName value="@log_time" />
  151. <dbType value="DateTime" />
  152. <layout type="log4net.Layout.RawTimeStampLayout" />
  153. </parameter>
  154. </appender>
  155.  
  156. <!--(二). 配置日志的的输出级别和加载日志的输出途径-->
  157. <root>
  158. <!--1. level中的value值表示该值及其以上的日志级别才会输出-->
  159. <!--OFF > FATAL(致命错误) > ERROR(一般错误) > WARN(警告) > INFO(一般信息) > DEBUG(调试信息) > ALL -->
  160. <!--OFF表示所有信息都不写入,ALL表示所有信息都写入-->
  161. <level value="ALL"></level>
  162. <!--2. append-ref标签表示要加载前面的日志输出途径代码 通过ref和appender标签的中name属性相关联-->
  163.  
  164. <!--<appender-ref ref="AdoNetAppender"></appender-ref>-->
  165. <appender-ref ref="log0"></appender-ref>
  166. <appender-ref ref="log1"></appender-ref>
  167. <appender-ref ref="log2"></appender-ref>
  168. </root>
  169. </log4net>
  170.  
  171. </configuration>

(2).创建日志仓储对象, 在框架封装的时候,建议把该对象封装成单例的。

  1. ILoggerRepository repository = LogManager.CreateRepository("myRespository");

(3).加载XML文件,前提要先把xml属性改为“嵌入的资源”,这里主要有两种方式,一种是反射的方式加载,需要加上“程序集名称”,如下面代码中的“MyLog”;另外一种是文件的方式,直接定位到文件路径即可。

A:反射

  1. Assembly assembly = Assembly.GetExecutingAssembly();
  2. var xml = assembly.GetManifestResourceStream("MyLog.Xml.log4net.xml");
  3. XmlConfigurator.Configure(repository, xml);

B:文件加载

  1. var file = new FileInfo(Directory.GetCurrentDirectory() + "/Xml/log4net.xml");
  2. XmlConfigurator.Configure(repository, file);

(4).创建日志对象,

如: ILog log = LogManager.GetLogger(repository.Name, "all");

  特别注意:这里和.Net平台有区别,第一个参数必须是仓储对象的名称,建议直接这么写:repository.Name,第二个参数就是以前.Net 平台下类似的,可以随意起名,如果要分文件存储的话,要配合xml文件中的过滤器,<filter type="log4net.Filter.LoggerMatchFilter"><loggerToMatch value = "OneLog" /></ filter >,实现分文件夹存储。

(5). 开开心心的使用Info、Debug等方法写入日志即可。

 完整代码如下:

  1. //1.创建日志仓储对象
  2. ILoggerRepository repository = LogManager.CreateRepository("myRespository");
  3.  
  4. //2.加载xml文件
  5. //2.1 反射的方式加载
  6. //Assembly assembly = Assembly.GetExecutingAssembly();
  7. //var xml = assembly.GetManifestResourceStream("MyLog.Xml.log4net.xml");
  8. //XmlConfigurator.Configure(repository, xml);
  9.  
  10. //2.2 文件的方式加载
  11. var file = new FileInfo(Directory.GetCurrentDirectory() + "/Xml/log4net.xml");
  12. XmlConfigurator.Configure(repository, file);
  13.  
  14. //3. 创建日志对象
  15. ILog log = LogManager.GetLogger(repository.Name, "all");
  16. ILog OneLog = LogManager.GetLogger(repository.Name, "OneLog");
  17.  
  18. //4. 写入日志
  19. log.Info("alllog");
  20. OneLog.Info("oneLog");

二. 分层封装使用

1.声明:

  MyLog02层仅仅需要添加对Utils层的引用,不需要再引入任何程序集。

2.目的:

  在Utils层中封装Log4net,然后可以在其它层中通过引用,直接调用。

3. 步骤:

(1). 给Utils层通过Nuget安装【log4net 2.0.8】,并将log4net.xml配置文件拷贝到Xml文件夹下,将其生成操作改为“嵌入的资源”。

(2). 新建LogUtils类,对log4net进行封装,其中日志仓储对象利用静态变量做成单例的

代码如下:

  1. public class LogUtils
  2. {
  3. //日志仓储(单例模式,静态变量,程序在第一次使用的时候被调用,由clr保证)
  4. private static ILoggerRepository loggerRepository;
  5. //1. 适用于全部文件夹
  6. public static ILog log;
  7. //2. OneLog文件夹
  8. public static ILog log1;
  9. //3. TwoLog文件夹
  10. public static ILog log2;
  11.  
  12. //声明文件夹名称(这里分两个文件夹)
  13. static string log1Name = "OneLog";
  14. static string log2Name = "TwoLog";
  15.  
  16. /// <summary>
  17. /// 初始化Log4net的配置
  18. /// xml文件一定要改为嵌入的资源
  19. /// </summary>
  20. public static void InitLog4Net()
  21. {
  22. //1. 创建日志仓储(单例)
  23. loggerRepository = loggerRepository ?? LogManager.CreateRepository("myLog4net");
  24. //2. 加载xml文件
  25. Assembly assembly = Assembly.GetExecutingAssembly();
  26. var xml = assembly.GetManifestResourceStream("Utils.Xml.log4net.xml");
  27. log4net.Config.XmlConfigurator.Configure(loggerRepository, xml);
  28. //3. 创建日志对象
  29. log = LogManager.GetLogger(loggerRepository.Name,"all");
  30. log1 = LogManager.GetLogger(loggerRepository.Name, log1Name);
  31. log2 = LogManager.GetLogger(loggerRepository.Name, log2Name);
  32.  
  33. }
  34.  
  35. /************************* 五种不同日志级别 *******************************/
  36. //FATAL(致命错误) > ERROR(一般错误) > WARN(警告) > INFO(一般信息) > DEBUG(调试信息)
  37.  
  38. #region 00-将调试的信息输出,可以定位到具体的位置(解决高层封装带来的问题)
  39. /// <summary>
  40. /// 将调试的信息输出,可以定位到具体的位置(解决高层封装带来的问题)
  41. /// </summary>
  42. /// <returns></returns>
  43. private static string getDebugInfo()
  44. {
  45. StackTrace trace = new StackTrace(true);
  46. return trace.ToString();
  47. }
  48. #endregion
  49.  
  50. #region 01-DEBUG(调试信息)
  51. /// <summary>
  52. /// DEBUG(调试信息)
  53. /// </summary>
  54. /// <param name="msg">日志信息</param>
  55. /// <param name="logName">文件夹名称</param>
  56. public static void Debug(string msg, string logName = "")
  57. {
  58. if (logName == "")
  59. {
  60. log.Debug(getDebugInfo() + msg);
  61. }
  62. else if (logName == log1Name)
  63. {
  64. log1.Debug(msg);
  65. }
  66. else if (logName == log2Name)
  67. {
  68. log2.Debug(msg);
  69. }
  70. }
  71. /// <summary>
  72. /// Debug
  73. /// </summary>
  74. /// <param name="msg">日志信息</param>
  75. /// <param name="exception">错误信息</param>
  76. public static void Debug(string msg, Exception exception)
  77. {
  78. log.Debug(getDebugInfo() + msg, exception);
  79. }
  80.  
  81. #endregion
  82.  
  83. #region 02-INFO(一般信息)
  84. /// <summary>
  85. /// INFO(一般信息)
  86. /// </summary>
  87. /// <param name="msg">日志信息</param>
  88. /// <param name="logName">文件夹名称</param>
  89. public static void Info(string msg, string logName = "")
  90. {
  91. if (logName == "")
  92. {
  93. log.Info(getDebugInfo() + msg);
  94. }
  95. else if (logName == log1Name)
  96. {
  97. log1.Info(msg);
  98. }
  99. else if (logName == log2Name)
  100. {
  101. log2.Info(msg);
  102. }
  103. }
  104. /// <summary>
  105. /// Info
  106. /// </summary>
  107. /// <param name="msg">日志信息</param>
  108. /// <param name="exception">错误信息</param>
  109. public static void Info(string msg, Exception exception)
  110. {
  111. log.Info(getDebugInfo() + msg, exception);
  112. }
  113. #endregion
  114.  
  115. #region 03-WARN(警告)
  116. /// <summary>
  117. ///WARN(警告)
  118. /// </summary>
  119. /// <param name="msg">日志信息</param>
  120. /// <param name="logName">文件夹名称</param>
  121. public static void Warn(string msg, string logName = "")
  122. {
  123. if (logName == "")
  124. {
  125. log.Warn(getDebugInfo() + msg);
  126. }
  127. else if (logName == log1Name)
  128. {
  129. log1.Warn(msg);
  130. }
  131. else if (logName == log2Name)
  132. {
  133. log2.Warn(msg);
  134. }
  135. }
  136. /// <summary>
  137. /// Warn
  138. /// </summary>
  139. /// <param name="msg">日志信息</param>
  140. /// <param name="exception">错误信息</param>
  141. public static void Warn(string msg, Exception exception)
  142. {
  143. log.Warn(getDebugInfo() + msg, exception);
  144. }
  145. #endregion
  146.  
  147. #region 04-ERROR(一般错误)
  148. /// <summary>
  149. /// ERROR(一般错误)
  150. /// </summary>
  151. /// <param name="msg">日志信息</param>
  152. /// <param name="logName">文件夹名称</param>
  153. public static void Error(string msg, string logName = "")
  154. {
  155. if (logName == "")
  156. {
  157. log.Error(getDebugInfo() + msg);
  158. }
  159. else if (logName == log1Name)
  160. {
  161. log1.Error(msg);
  162. }
  163. else if (logName == log2Name)
  164. {
  165. log2.Error(msg);
  166. }
  167. }
  168. /// <summary>
  169. /// Error
  170. /// </summary>
  171. /// <param name="msg">日志信息</param>
  172. /// <param name="exception">错误信息</param>
  173. public static void Error(string msg, Exception exception)
  174. {
  175. log.Error(getDebugInfo() + msg, exception);
  176. }
  177. #endregion
  178.  
  179. #region 05-FATAL(致命错误)
  180. /// <summary>
  181. /// FATAL(致命错误)
  182. /// </summary>
  183. /// <param name="msg">日志信息</param>
  184. /// <param name="logName">文件夹名称</param>
  185. public static void Fatal(string msg, string logName = "")
  186. {
  187. if (logName == "")
  188. {
  189. log.Fatal(getDebugInfo() + msg);
  190. }
  191. else if (logName == log1Name)
  192. {
  193. log1.Fatal(msg);
  194. }
  195. else if (logName == log2Name)
  196. {
  197. log2.Fatal(msg);
  198. }
  199. }
  200. /// <summary>
  201. /// Fatal
  202. /// </summary>
  203. /// <param name="msg">日志信息</param>
  204. /// <param name="exception">错误信息</param>
  205. public static void Fatal(string msg, Exception exception)
  206. {
  207. log.Fatal(getDebugInfo() + msg, exception);
  208. }
  209.  
  210. #endregion
  211.  
  212. }

(3). 对“MyLog”项目添加对“Utils”的引用,然后在Startup类中ConfigureServices方法中进行初始化Log4net,如下:

  1. LogUtils.InitLog4Net();

(4).根据情况进行调用。

  如:LogUtils.Info("我是二哈"); LogUtils.Info("我是二哈1", "OneLog");

三. 微软出品的日志程序

1. 声明:

   微软的日志扩展库中新增了对Log4Net的支持,仅仅需要在MyLog2项目中引入微软自己的 【Microsoft.Extensions.Logging.Log4Net.AspNetCore】 2.2.11即可,不需要再重复引入log4net官方程序集。

2. 使用步骤:

(1). 通过Nuget安装程序集【Microsoft.Extensions.Logging.Log4Net.AspNetCore】,版本号:2.2.11

(2). 在Xml文件夹中新建一个log4net2.xml的配置文件,并将其改为 “始终复制!!!”【这里和前面处理配置文件的方式不同哦】

(3). 在Startup类中的Configure方法中先注入ILoggerFactory对象,然后初始化log4net,代码如下:

  1. loggerFactory.AddLog4Net("Xml/log4net2.xml");

  解释:这里加载的是bin最终目录下的文件,所以步骤②中要将其改为“始终复制”(即复制到bin的最终目录下),如果这里不写参数,默认加载的是bin最终目录下的log4net.config文件。

(4). 在控制器里通过构造函数注入ILogger对象,注入的时候一定要注意<out TCategoryName> ,需要传入一个值。

(5). 进行调用,这里有两种方式区分日志级别:Log(LogLevel.Warning, "LogLevel.Warning"); 或者LogWarning("LogLevel.Warning");

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第八节:Asp.Net Core整合Log4net(官方的、微软的两种)的更多相关文章

  1. 第三节:Windows平台部署Asp.Net Core应用(基于IIS和Windows服务两种模式)

    一. 简介 二. 文件系统发布至IIS 三. Web部署发布至IIS 四. FTP发布至IIS 五. Windows服务的形式发布 ! 作       者 : Yaopengfei(姚鹏飞) 博客地址 ...

  2. ASP.NET Core整合Zipkin链路跟踪

    前言     在日常使用ASP.NET Core的开发或学习中,如果有需要使用链路跟踪系统,大多数情况下会优先选择SkyAPM.我们之前也说过SkyAPM设计确实比较优秀,巧妙的利用Diagnosti ...

  3. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  4. Asp.net core 使用log4net作为日志组件,记录日志到本地。

    原文:Asp.net core 使用log4net作为日志组件,记录日志到本地. GitHub demo :https://github.com/zhanglilong23/Asp.NetCore.D ...

  5. ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式

    由于ASP.NET Core应用是一个同时处理多个请求的服务器应用,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止.出于安全方面的考量,为了避免敏感信息的外泄,客户端在默认的情况下并不会得 ...

  6. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...

  7. ASP.NET Core使用log4net记录日志

    .NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自带了日志组件,到目前为止还没用过,而我本人常用的是log4net,下面简单讲讲.NET CORE下怎么使用log4net ...

  8. .NET Core整合log4net以及全局异常捕获实现2

    Startup代码 public static ILoggerRepository repository { get; set; } public Startup(IConfiguration con ...

  9. ASP.NET Core 集成测试中模拟登录用户的一种姿势

    不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...

随机推荐

  1. BUAA-OO-2019 第四单元总结

    UML作业架构设计 这一单元的作业本质上是对数据之间的联系进行解析,并重新建立数据结构以方便查询的工作,这就要求我们了解各种UmlElement的结构以及他们之间的关系是如何组织的. 第十三次作业 在 ...

  2. django framework插件使用1

    安装 REST框架要求以下内容: Python(3.5.3.6.3.7) Django(1.11.2.0.2.1.2.2) pip install djangorestframework pip in ...

  3. php获取ssl验证的https页面的源码

    $response = "https://faculty.xidian.edu.cn/system/resource/tsites/tsitesencrypt.jsp?id=_tsites_ ...

  4. 通过async实现协程的延迟执行及结果获取

    在上一次https://www.cnblogs.com/webor2006/p/12022065.html对于协程的async和wait进行了初步的学习,其可以加速执行的性能,其实对于async它是提 ...

  5. python脚本测试websocket接口协议

    import websocket url = 'wss://host:port/rt/tr' #websocket连接地址 ws = websocket.create_connection(url) ...

  6. LCD编程_简单测试

    首先,需要编写一个led_test.c的文件,依据代码框架,在led_test.c中我们能够看到的只是led.c.我们是看不到led_controller.c的.比如说,在led_test.c中,需要 ...

  7. 配置Maven环境变量-Eclipse/Idea添加Maven

    1. 文件下载 官网下载地址:http://maven.apache.org/download.cgi 下方有我提供的下载链接. 由于下载缓慢,提供一份我的下载链接:https://www.lanzo ...

  8. Pandas | 28 与SQL比较

    由于许多潜在的Pandas用户对SQL有一定的了解,因此本文章旨在提供一些如何使用Pandas执行各种SQL操作的示例. 文件:tips.csv - total_bill,tip,sex,smoker ...

  9. axios post方式请求x-ww格式的数据

    //使用axios时,要确定是json格式还是x-www格式的,axios默认是json格式的,如果是x-ww格式需要做如下配置: let url = "/hehe/site/getcomm ...

  10. 搜索法 | 1103 dfs搜索:符合条件的多项式

    其实这题我已经写过两遍了,但都是在看过算法笔记的情况下写的.方法不难,只要能想出来. 找到一个项数为k,每项为p次幂,和为n,并且在有多个结果的情况下要求数字之和最大的一个多项式.如果数字之和相等.还 ...