1. 引入 log4net.dll
  2. 项目->添加->新建项->应用程序配置文件,命名为 log4net.config,并把属性的复制到输出目录设置为 如果较新则复制,后续客户端需要读取在 debug 下的这个文件;
  3. 封装日志类 WriteLog

1. log4net.config

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <!--<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>-->
  5. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  6. </configSections>
  7. <log4net>
  8. <!--定义输出到单个文件中-->
  9. <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
  10. <!--定义文件存放位置,也可以使用环境变量来设置-->
  11. <file value="${TMP}\YunXing\log-file.txt" />
  12. <!--<file value="log-file.txt" />-->
  13. <!--定义保存方式,true表示在原有文件后追加,false表示覆盖原有文件-->
  14. <appendToFile value="true" />
  15. <layout type="log4net.Layout.PatternLayout">
  16. <!--每条日志首尾的文字说明-->
  17. <header value="[Header]
  18. " />
  19. <footer value="[Footer]
  20. " />
  21. <!--输出格式-->
  22. <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
  23. <!--<conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />-->
  24. <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] 异常行号:%line行- 错误描述:%message%newline" />
  25. </layout>
  26. <!-- Alternate layout using XML
  27. <layout type="log4net.Layout.XMLLayout" /> -->
  28. <!--根据级别筛选日志,DEBUG,INFO,WARN,ERROR,FATAL-->
  29. <threshold value="DEBUG" />
  30. </appender>
  31. <!--定义输出到多个文件中-->
  32. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  33. <!--定义文件存放位置,也可以使用环境变量来设置-->
  34. <!-- <file value="${TMP}\log-file.txt" /> -->
  35. <file value="C:\MaoLog\" />
  36. <!--使用Unicode编码-->
  37. <Encoding value="UTF-8" />
  38. <!--定义保存方式,true表示在原有文件后追加,false表示覆盖原有文件-->
  39. <appendToFile value="true" />
  40. <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
  41. <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  42. <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
  43. <rollingStyle value="Date" />
  44. <!--当日志文件达到MaxFileSize大小,就自动创建备份文件,这里设置最大备份数量-->
  45. <maxSizeRollBackups value="20" />
  46. <!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
  47. <maximumFileSize value="1MB" />
  48. <!--是否固定文件名,因为是滚动记录,所以用false-->
  49. <staticLogFileName value="false" />
  50. <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用,后缀必须加上&quot;或'],日志文件总的路径即file+datePattern-->
  51. <!--此处按日期产生文件夹,文件名固定。注意&quot; 的位置-->
  52. <!--<DatePattern value="yyyy-MM-dd/'TimerServer.log'"/>-->
  53. <!--这是按日期产生文件夹,并在文件名(TimerServer)前也加上日期-->
  54. <!--<DatePattern value="yyyyMMdd/yyyyMMdd'-TimerServer.log';"/>-->
  55. <!--这是先按日期产生文件夹,再形成下一级固定的文件夹(TimerServer/)-->
  56. <!--<DatePattern value="yyyyMMdd/'TimerServer/TimerServer.log'"/>-->
  57. <datePattern value="yyyyMMdd'.log'" />
  58. <!--日志记录格式,%property{Operator}、%property{Action}是自定义的输出-->
  59. <layout type="log4net.Layout.PatternLayout">
  60. <!--每条日志首尾的文字说明-->
  61. <header value="[***Header***]
  62. " />
  63. <footer value="[***Footer***]
  64. " />
  65. <!--输出格式,%exception异常信息,可写可不写,只要调用的时候有传入Exception,日志会自动记录-->
  66. <!--样例:
  67. [Header]
  68. 记录时间:2017-11-30 16:04:51,258 线程ID:[19] 日志级别:ERROR 所在类:GoSun.VMapEngine.Vmap.YunXing.MainViewModel
  69. 日志描述:实时查询数据错误。
  70. [Footer]-->
  71. <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 所在类:%logger 异常行号:%line行%newline 日志描述:%message%newline%exception========================%newline%newline" />
  72. </layout>
  73. <!-- Alternate layout using XML
  74. <layout type="log4net.Layout.XMLLayout" /> -->
  75. <!--根据级别筛选日志-->
  76. <!--<threshold value="INFO" />-->
  77. </appender>
  78. <!--定义输出到控制台命令行中-->
  79. <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  80. <layout type="log4net.Layout.PatternLayout">
  81. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  82. </layout>
  83. <!--根据级别筛选日志-->
  84. <threshold value="ALL" />
  85. </appender>
  86. <!--定义输出到windows事件中-->
  87. <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
  88. <layout type="log4net.Layout.PatternLayout">
  89. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  90. </layout>
  91. <!--根据级别筛选日志-->
  92. <threshold value="INFO" />
  93. </appender>
  94. <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
  95. <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
  96. <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" />
  97. <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
  98. <!--定义各个参数-->
  99. <parameter>
  100. <parameterName value="@logDate" />
  101. <dbType value="String" />
  102. <size value="240" />
  103. <layout type="log4net.Layout.PatternLayout">
  104. <conversionPattern value="%date" />
  105. </layout>
  106. </parameter>
  107. <parameter>
  108. <parameterName value="@thread" />
  109. <dbType value="String" />
  110. <size value="240" />
  111. <layout type="log4net.Layout.PatternLayout">
  112. <conversionPattern value="%thread" />
  113. </layout>
  114. </parameter>
  115. <parameter>
  116. <parameterName value="@logLevel" />
  117. <dbType value="String" />
  118. <size value="240" />
  119. <layout type="log4net.Layout.PatternLayout">
  120. <conversionPattern value="%level" />
  121. </layout>
  122. </parameter>
  123. <parameter>
  124. <parameterName value="@logger" />
  125. <dbType value="String" />
  126. <size value="240" />
  127. <layout type="log4net.Layout.PatternLayout">
  128. <conversionPattern value="%logger" />
  129. </layout>
  130. </parameter>
  131. <parameter>
  132. <parameterName value="@message" />
  133. <dbType value="String" />
  134. <size value="240" />
  135. <layout type="log4net.Layout.PatternLayout">
  136. <conversionPattern value="%message" />
  137. </layout>
  138. </parameter>
  139. <!--根据级别筛选日志-->
  140. <threshold value="INFO" />
  141. </appender>
  142. <!--定义输出到SQL Server数据库中-->
  143. <!--
  144. 在SQL Server中创建表的SQL语句
  145. CREATE TABLE [dbo].[Log] (
  146. [Id] [int] IDENTITY (1, 1) NOT NULL,
  147. [Date] [datetime] NOT NULL,
  148. [Thread] [varchar] (255) NOT NULL,
  149. [Domain] [varchar] (255) NOT NULL,
  150. [UserName] [varchar] (255) NOT NULL,
  151. [Level] [varchar] (50) NOT NULL,
  152. [Logger] [varchar] (255) NOT NULL,
  153. [Message] [varchar] (4000) NOT NULL,
  154. [Exception] [varchar] (2000) NULL
  155. );
  156. -->
  157. <appender name="AdoNetAppender_SQLServer" type="log4net.Appender.AdoNetAppender">
  158. <bufferSize value="1" />
  159. <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  160. <!--<connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />-->
  161. <connectionString value="Data Source=(local)\SQLEXPRESSR2;Initial Catalog=CHEMSRuntime;Persist Security Info=True;User ID=sa;Password=dongben" />
  162. <commandText value="INSERT INTO Log ([Date],[Thread],[Domain],[UserName],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @domain, @log_username, @log_level, @logger, @message, @exception)" />
  163. <parameter>
  164. <parameterName value="@log_date" />
  165. <dbType value="DateTime" />
  166. <layout type="log4net.Layout.RawTimeStampLayout" />
  167. </parameter>
  168. <parameter>
  169. <parameterName value="@thread" />
  170. <dbType value="String" />
  171. <size value="255" />
  172. <layout type="log4net.Layout.PatternLayout">
  173. <conversionPattern value="%thread" />
  174. </layout>
  175. </parameter>
  176. <parameter>
  177. <parameterName value="@domain" />
  178. <dbType value="String" />
  179. <size value="255" />
  180. <layout type="log4net.Layout.PatternLayout">
  181. <conversionPattern value="%appdomain" />
  182. </layout>
  183. </parameter>
  184. <parameter>
  185. <parameterName value="@log_username" />
  186. <dbType value="String" />
  187. <size value="255" />
  188. <layout type="log4net.Layout.PatternLayout">
  189. <conversionPattern value="%username" />
  190. </layout>
  191. </parameter>
  192. <parameter>
  193. <parameterName value="@log_level" />
  194. <dbType value="String" />
  195. <size value="50" />
  196. <layout type="log4net.Layout.PatternLayout">
  197. <conversionPattern value="%level" />
  198. </layout>
  199. </parameter>
  200. <parameter>
  201. <parameterName value="@logger" />
  202. <dbType value="String" />
  203. <size value="255" />
  204. <layout type="log4net.Layout.PatternLayout">
  205. <conversionPattern value="%logger" />
  206. </layout>
  207. </parameter>
  208. <parameter>
  209. <parameterName value="@message" />
  210. <dbType value="String" />
  211. <size value="4000" />
  212. <layout type="log4net.Layout.PatternLayout">
  213. <conversionPattern value="%message" />
  214. </layout>
  215. </parameter>
  216. <parameter>
  217. <parameterName value="@exception" />
  218. <dbType value="String" />
  219. <size value="2000" />
  220. <layout type="log4net.Layout.ExceptionLayout" />
  221. </parameter>
  222. <!--根据级别筛选日志-->
  223. <threshold value="INFO" />
  224. </appender>
  225. <!--定义使用UDP输出到网络-->
  226. <appender name="UdpAppender8081" type="log4net.Appender.UdpAppender">
  227. <param name="RemoteAddress" value="255.255.255.255" />
  228. <param name="RemotePort" value="8081" />
  229. <layout type="log4net.Layout.XmlLayout">
  230. <param name="Prefix" value="" />
  231. </layout>
  232. <!--根据级别筛选日志-->
  233. <threshold value="ALL" />
  234. </appender>
  235. <appender name="UdpAppender8080" type="log4net.Appender.UdpAppender">
  236. <param name="RemoteAddress" value="255.255.255.255" />
  237. <param name="RemotePort" value="8080" />
  238. <layout type="log4net.Layout.XmlLayout">
  239. <param name="Prefix" value="" />
  240. </layout>
  241. <!--根据级别筛选日志-->
  242. <threshold value="INFO" />
  243. </appender>
  244. <!--定义日志的输出媒介,下面定义日志以几种方式输出。也可以下面的按照一种类型或其他类型输出。-->
  245. <root>
  246. <!--文件形式记录日志-->
  247. <!--<appender-ref ref="LogFileAppender" />-->
  248. <appender-ref ref="RollingFileAppender" />
  249. <!--控制台控制显示日志-->
  250. <!--<appender-ref ref="ConsoleAppender" />-->
  251. <!--Windows事件日志-->
  252. <!--<appender-ref ref="EventLogAppender" />-->
  253. <!--如果不启用相应的日志记录,可以通过这种方式注释掉-->
  254. <!--<appender-ref ref="AdoNetAppender_Access" />-->
  255. <!--<appender-ref ref="AdoNetAppender_SQLServer" />-->
  256. <!--<appender-ref ref="UdpAppender8080" />-->
  257. <!--<appender-ref ref="UdpAppender8081" />-->
  258. <!--由高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->
  259. <level value="DEBUG" />
  260. </root>
  261. </log4net>
  262. </configuration>

2. WriteLog

  1. /// <summary>
  2. /// 日志类
  3. /// </summary>
  4. public class WriteLog
  5. {
  6. /// <summary>
  7. ///
  8. /// </summary>
  9. /// <param name="path">配置文件路径</param>
  10. public WriteLog(string path = "log4net.config")
  11. {
  12. if (string.IsNullOrEmpty(path))
  13. {
  14. //直接读取程序配置文件app.config
  15. log4net.Config.XmlConfigurator.Configure();
  16. }
  17. else
  18. {
  19. log4net.Config.XmlConfigurator.Configure(new ystem.IO.FileInfo(path));
  20. }
  21. }
  22. private ILog GetLogger()
  23. {
  24. StackTrace st = new StackTrace(true);
  25. if (st.FrameCount > 2)
  26. {
  27. return LogManager.GetLogger(st.GetFrame(2).GetMethod().DeclaringType);
  28. }
  29. else
  30. {
  31. return LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  32. }
  33. }
  34. #region DEBUG
  35. /// <summary>
  36. /// 调试日志 15
  37. /// </summary>
  38. /// <param name="message">日志描述</param>
  39. public void Debug(object message)
  40. {
  41. GetLogger().Debug(message);
  42. }
  43. /// <summary>
  44. /// 调试日志
  45. /// </summary>
  46. /// <param name="message">日志描述</param>
  47. /// <param name="exception">日志异常</param>
  48. public void Debug(object message, Exception exception)
  49. {
  50. GetLogger().Debug(message, exception);
  51. }
  52. public void DebugFormat(string format, params object[] args)
  53. {
  54. GetLogger().DebugFormat(format, args);
  55. }
  56. public void DebugFormat(string format, object arg0)
  57. {
  58. GetLogger().DebugFormat(format, arg0);
  59. }
  60. public void DebugFormat(string format, object arg0, object arg1)
  61. {
  62. GetLogger().DebugFormat(format, arg0, arg1);
  63. }
  64. public void DebugFormat(string format, object arg0, object arg1, object arg2)
  65. {
  66. GetLogger().DebugFormat(format, arg0, arg1, arg2);
  67. }
  68. public void DebugFormat(IFormatProvider provider, string format, params object[] args)
  69. {
  70. GetLogger().DebugFormat(provider, format, args);
  71. }
  72. #endregion
  73. #region INFO
  74. public void Info(object message)
  75. {
  76. GetLogger().Info(message);
  77. }
  78. public void Info(object message, Exception exception)
  79. {
  80. GetLogger().Info(message, exception);
  81. }
  82. public void InfoFormat(string format, params object[] args)
  83. {
  84. GetLogger().InfoFormat(format, args);
  85. }
  86. public void InfoFormat(string format, object arg0)
  87. {
  88. GetLogger().InfoFormat(format, arg0);
  89. }
  90. public void InfoFormat(string format, object arg0, object arg1)
  91. {
  92. GetLogger().InfoFormat(format, arg0, arg1);
  93. }
  94. public void InfoFormat(string format, object arg0, object arg1, object arg2)
  95. {
  96. GetLogger().InfoFormat(format, arg0, arg1, arg2);
  97. }
  98. public void InfoFormat(IFormatProvider provider, string format, params object[] args)
  99. {
  100. GetLogger().InfoFormat(provider, format, args);
  101. }
  102. #endregion
  103. #region WARN
  104. public void Warn(object message)
  105. {
  106. GetLogger().Warn(message);
  107. }
  108. public void Warn(object message, Exception exception)
  109. {
  110. GetLogger().Warn(message, exception);
  111. }
  112. public void WarnFormat(string format, params object[] args)
  113. {
  114. GetLogger().WarnFormat(format, args);
  115. }
  116. public void WarnFormat(string format, object arg0)
  117. {
  118. GetLogger().WarnFormat(format, arg0);
  119. }
  120. public void WarnFormat(string format, object arg0, object arg1)
  121. {
  122. GetLogger().WarnFormat(format, arg0, arg1);
  123. }
  124. public void WarnFormat(string format, object arg0, object arg1, object arg2)
  125. {
  126. GetLogger().WarnFormat(format, arg0, arg1, arg2);
  127. }
  128. public void WarnFormat(IFormatProvider provider, string format, params object[] args)
  129. {
  130. GetLogger().WarnFormat(provider, format, args);
  131. }
  132. #endregion
  133. #region ERROR
  134. public void Error(object message)
  135. {
  136. GetLogger().Error(message);
  137. }
  138. public void Error(object message, Exception exception)
  139. {
  140. GetLogger().Error(message, exception);
  141. }
  142. public void ErrorFormat(string format, params object[] args)
  143. {
  144. GetLogger().ErrorFormat(format, args);
  145. }
  146. public void ErrorFormat(string format, object arg0)
  147. {
  148. GetLogger().ErrorFormat(format, arg0);
  149. }
  150. public void ErrorFormat(string format, object arg0, object arg1)
  151. {
  152. GetLogger().ErrorFormat(format, arg0, arg1);
  153. }
  154. public void ErrorFormat(string format, object arg0, object arg1, object arg2)
  155. {
  156. GetLogger().ErrorFormat(format, arg0, arg1, arg2);
  157. }
  158. public void ErrorFormat(IFormatProvider provider, string format, params object[] args)
  159. {
  160. GetLogger().ErrorFormat(provider, format, args);
  161. }
  162. #endregion
  163. #region FATAL
  164. public void Fatal(object message)
  165. {
  166. GetLogger().Fatal(message);
  167. }
  168. public void Fatal(object message, Exception exception)
  169. {
  170. GetLogger().Fatal(message, exception);
  171. }
  172. public void FatalFormat(string format, params object[] args)
  173. {
  174. GetLogger().FatalFormat(format, args);
  175. }
  176. public void FatalFormat(string format, object arg0)
  177. {
  178. GetLogger().FatalFormat(format, arg0);
  179. }
  180. public void FatalFormat(string format, object arg0, object arg1)
  181. {
  182. GetLogger().FatalFormat(format, arg0, arg1);
  183. }
  184. public void FatalFormat(string format, object arg0, object arg1, object arg2)
  185. {
  186. GetLogger().FatalFormat(format, arg0, arg1, arg2);
  187. }
  188. public void FatalFormat(IFormatProvider provider, string format, params object[] args)
  189. {
  190. GetLogger().FatalFormat(provider, format, args);
  191. }
  192. #endregion
  193. #region 日志级别过滤标志
  194. public bool IsDebugEnabled
  195. {
  196. get { return GetLogger().IsDebugEnabled; }
  197. }
  198. public bool IsInfoEnabled
  199. {
  200. get { return GetLogger().IsInfoEnabled; }
  201. }
  202. public bool IsWarnEnabled
  203. {
  204. get { return GetLogger().IsWarnEnabled; }
  205. }
  206. public bool IsErrorEnabled
  207. {
  208. get { return GetLogger().IsErrorEnabled; }
  209. }
  210. public bool IsFatalEnabled
  211. {
  212. get { return GetLogger().IsFatalEnabled; }
  213. }
  214. #endregion
  215. }

3. 可选的静态封装

  1. public static class CommonHelper
  2. {
  3. public static WriteLog WriteLog = new WriteLog("log4net.config");
  4. }

4. 打日志

  1. CommonHelper.WriteLog.Error("出错了", new Exception() {});

C# 基础 - 日志捕获二使用 log4net的更多相关文章

  1. C# 基础 - 日志捕获一使用 StreamWriter

    public static class LogHelper { private static readonly string _baseDir = AppDomain.CurrentDomain.Ba ...

  2. WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

    WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日 ...

  3. .NET下日志系统的搭建——log4net+kafka+elk

    .NET下日志系统的搭建--log4net+kafka+elk 前言     我们公司的程序日志之前都是采用log4net记录文件日志的方式(有关log4net的简单使用可以看我另一篇博客),但是随着 ...

  4. Oracle数据库基础入门《二》Oracle内存结构

    Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...

  5. SpringBoot初始教程之日志处理(二)

    SpringBoot初始教程之日志处理(二) 1.介绍 SpringBoot默认是采用logback进行日志处理.Logback是由log4j创始人设计的又一个开源日志组件.Logback是由log4 ...

  6. ActiveMQ基础教程(二):安装与配置(单机与集群)

    因为本文会用到集群介绍,因此准备了三台虚拟机(当然读者也可以使用一个虚拟机,然后使用不同的端口来模拟实现伪集群): 192.168.209.133 test1 192.168.209.134 test ...

  7. Kafka基础教程(二):Kafka安装

    因为kafka是基于Zookeeper的,而Zookeeper一般都是一个分布式的集群,尽管kafka有自带Zookeeper,但是一般不使用自带的,都是使用外部安装的,所以首先我们需要安装Zooke ...

  8. Javascript基础回顾 之(二) 作用域

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  9. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

随机推荐

  1. 四、Jmeter 集合点(实际场景应用)

    一.jmeter集合点的作用域及作用范围 先明确一些概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后: 是的,你没有看错,不管这个定时器的位置放在sampler之后,还是之下,它 ...

  2. 快速获取 Wi-Fi 密码——GitHub 热点速览 v.21.06

    作者:HelloGitHub-小鱼干 还有 2 天开启春节七天宅家生活,GitHub 也凑了一把春节热闹,wifi-password 连续霸榜 3 天,作为一个能快速让你连上 Wi-Fi 的小工具,春 ...

  3. js中for循环遍历的写法

    众所周知,for循环是编程中必不可少的知识点:那么如何高效的写出循环呢? 我们要先知道for循环的基础样式是由自有变量自增自减和if判组成的: 1 for(条件){ 2 执行语句 3 } 而for循环 ...

  4. [Python] Pandas的delete、drop函数的用法

    目录 drop函数 Axis(轴)含义 drop用法实验 delete函数 drop函数 DataFrame.drop(labels=None, axis=0, index=None, columns ...

  5. Python——控制鼠标键盘

    一.安装包 pip install pynput 二.引用包 from pynput import mouse,keyboard 三.控制鼠标 from pynput.mouse import But ...

  6. QXDM和QCAT软件使用指南

    一.传送门 链接:https://pan.baidu.com/s/1i55YXnf 密码:v6nw 二.QXDM,QPST和QCAT的简单说明 QXDM,QPST和QCAT是Qualcomm高通公司针 ...

  7. Leetcode(104)-二叉树的最大深度

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...

  8. Bash on Ubuntu on Windows ( Windows Subsystem for Linux)

    1 #  Bash on ubuntu on Windows http://www.cnblogs.com/anonymous-ufo/p/6143480.html 1 1 如何启用Bash on u ...

  9. Node.js _dirname & path All In One

    Node.js _dirname & path All In One file path 相对路径 绝对路径 _dirname https://nodejs.org/docs/latest/a ...

  10. GitHub in depth

    GitHub in depth GitHub 高级玩法 / 进阶教程 https://github.com/trending/dart?since=daily https://github.com/t ...