log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。

前提

最近做项目需要记录系统日志和用户操作日志,就想起来了log4net,但是业务需要需要加入自定义属性,并把自定义属性日志数据插入到数据库中,看好趁这个机会学习总结下。

详细步骤

一、首先下载:log4net.dll  下载地址:http://logging.apache.org/log4net/download_log4net.cgi

二、在项目中进行引用。这个不多说了,相信大家都很熟悉这个过程。

三、在web.config,加入以下代码:

1  <configSections>
2 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
3 </configSections>

四、然后在与web.config同目录下面新建个配置文件,我这建了个log4net.config,如下图

五、在log4net.config加入以下代码,里面注释和详细 ,大家可以看如下代码:

  1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3 <configSections>
4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
5 </configSections>
6
7 <log4net>
8 <logger name="myLogger">
9 <level value="INFO"/>
10 <appender-ref ref="AdoNetAppender_SqlServer"/>
11 <!--sql server数据库1-->
12 <appender-ref ref="AdoNetAppender_SqlServer1"/>
13 <!--sql server数据库2-->
14 <appender-ref ref="AdoNetAppender_Sqllite"/>
15 <!--sqlite数据库-->
16 <appender-ref ref="InfoAppender"/>
17 <!--记录到文件-->
18 </logger>
19
20 <!--sql server数据库1-->
21 <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
22 <!-- BufferSize 为缓冲区大小,只有日志记录超5 条才会一块写入到数据库 -->
23 <!-- 或写为<param name="BufferSize" value="10" /> -->
24 <bufferSize value="0"/>
25 <!-- 引用 -->
26 <!--2.0这是对应sql2008 如是2000或2005另外配置-->
27 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
28
29 <!-- 连接数据库字符串 -->
30 <connectionString value="Data Source=.;Initial Catalog=Log;User ID=sa;Password=sa123;" />
31 <!-- 插入到表Log -->
32 <commandText value = "INSERT INTO Mylogger ([EVENTTYPE],[TIMESTAMP],[EVENTCATEGORY],[EVENT_ID],[COMPUTERNAME],[MAC_ADDRESS],[USERNAME],[SOURCETYPE],[SOURCE],[DESCRIPTION],[COLLECTDATE]) VALUES (@Event_Type,@log_date, @EventCategory, @Event_ID, @ComputerName,@Mac_Address,@UserName,@SourceType,@Source,@Description,@CollectDate) "/>
33
34 <!-- 日志类型,这里均为3 -->
35 <parameter>
36 <parameterName value = "@Event_Type"/>
37 <dbType value = "Int32"/>
38 <!--<dbType value = "String"/>
39 <size value = "50"/>-->
40 <!-- LogComponent 是类所在的命名空间,MyLayout 是自定义属性所在的类,这是我们自己要写的部分,将在下面介绍。 -->
41 <layout type = "Log4netExpand.MyLayout,log4nettest">
42 <!-- 当用到property 时,就表明这是用户自定义的字段属性啦,是log4net 中所没有提供的字段。 -->
43 <conversionPattern value = "%property{Event_Type} "/>
44 </layout>
45 </parameter>
46
47 <!-- 日志记录时间,RawTimeStampLayout 为默认的时间输出格式 -->
48 <parameter>
49 <parameterName value = "@log_date"/>
50 <dbType value = "DateTime"/>
51 <layout type = "log4net.Layout.RawTimeStampLayout"/>
52 <!-- /这里呢是获取log4net 中提供的日志时间 -->
53 </parameter>
54
55 <!-- 日志分类描述 -->
56 <parameter>
57 <parameterName value = "@EventCategory"/>
58 <dbType value = "String"/>
59 <size value = "50"/>
60 <layout type = "Log4netExpand.MyLayout,log4nettest">
61 <conversionPattern value = "%property{EventCategory}"/>
62 </layout>
63 </parameter>
64
65 <!-- 日志分类号 -->
66 <parameter>
67 <parameterName value = "@Event_ID"/>
68 <dbType value = "Int32"/>
69 <layout type = "Log4netExpand.MyLayout,log4nettest">
70 <conversionPattern value = "%property{Event_ID}"/>
71 </layout>
72 </parameter>
73
74 <!-- 计算机IP -->
75 <parameter>
76 <parameterName value = "@ComputerName"/>
77 <dbType value = "String"/>
78 <size value = "50"/>
79 <layout type = "Log4netExpand.MyLayout,log4nettest">
80 <conversionPattern value = "%property{ComputerName}"/>
81 </layout>
82 </parameter>
83
84 <!-- 计算机Mac 信息 -->
85 <parameter>
86 <parameterName value = "@Mac_Address"/>
87 <dbType value = "String"/>
88 <size value = "50 "/>
89 <layout type = "Log4netExpand.MyLayout, log4nettest">
90 <conversionPattern value = "%property{Mac_Address}"/>
91 </layout>
92 </parameter>
93
94 <!-- 登陆系统用户名 -->
95 <parameter>
96 <parameterName value = "@UserName"/>
97 <dbType value = "String"/>
98 <size value = "50"/>
99 <layout type = "Log4netExpand.MyLayout,log4nettest">
100 <conversionPattern value = "%property{UserName}"/>
101 </layout>
102 </parameter>
103
104 <!-- 事件来源类型,这里默认为Rier -->
105 <parameter>
106 <parameterName value = "@SourceType"/>
107 <dbType value = "String"/>
108 <size value = "20"/>
109 <layout type = "Log4netExpand.MyLayout,log4nettest">
110 <conversionPattern value = "%property{SourceType}"/>
111 </layout>
112 </parameter>
113
114 <!-- 事件来源 -->
115 <parameter>
116 <parameterName value = "@Source "/>
117 <dbType value = "String"/>
118 <size value = "50"/>
119 <layout type = "Log4netExpand.MyLayout,log4nettest">
120 <conversionPattern value = "%property{Source}"/>
121 </layout>
122 </parameter>
123
124 <!-- 事件描述 -->
125 <parameter>
126 <parameterName value = "@Description "/>
127 <dbType value = "String"/>
128 <size value = "4000"/>
129 <layout type = "Log4netExpand.MyLayout, log4nettest">
130 <conversionPattern value = "%property{Description}"/>
131 </layout>
132 </parameter>
133
134 <!-- 日志收集时间 -->
135 <parameter>
136 <parameterName value = "@CollectDate"/>
137 <dbType value = "DateTime"/>
138 <layout type="log4net.Layout.RawTimeStampLayout" />
139 </parameter>
140 </appender>
141
142 <!--记录到文件-->
143 <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
144 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
145
146 <param name="File" value="Log\\INFO\\"/>
147 <param name="AppendToFile" value="true"/>
148 <param name="MaxFileSize" value="10240" />
149 <param name="MaxSizeRollBackups" value="100"/>
150 <param name="StaticLogFileName" value="false"/>
151 <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;"/>
152 <param name="RollingStyle" value="Date"/>
153 <layout type="log4net.Layout.PatternLayout">
154 <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />
155 </layout>
156 </appender>
157
158 <!--sql server数据库2-->
159 <appender name="AdoNetAppender_SqlServer1" type="log4net.Appender.AdoNetAppender">
160 <bufferSize value="0"/>
161 <!--2.0这是对应sql2008 如是2000或2005另外配置-->
162 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
163
164 <!-- 连接数据库字符串 -->
165 <connectionString value="Data Source=.;Initial Catalog=Log;User ID=sa;Password=sa123;" />
166
167 <!-- 插入到表Log -->
168 <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message,@exception)"/>
169
170 <parameter>
171 <parameterName value="@log_date"/>
172 <dbType value="DateTime"/>
173
174 <layout type="log4net.Layout.PatternLayout">
175 <conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
176 </layout>
177 <!-- <layout type="log4net.Layout.RawTimeStampLayout"/>-->
178 </parameter>
179 <parameter>
180 <parameterName value="@thread"/>
181 <dbType value="String"/>
182 <size value="255"/>
183 <!-- LogComponent 是类所在的命名空间,MyLayout 是自定义属性所在的类,这是我们自己要写的部分,将在下面介绍。 -->
184 <layout type="log4net.Layout.PatternLayout">
185 <conversionPattern value="%thread"/>
186 </layout>
187 </parameter>
188 <parameter>
189 <parameterName value="@log_level"/>
190 <dbType value="String"/>
191 <size value="50"/>
192 <layout type="log4net.Layout.PatternLayout">
193 <conversionPattern value="%level"/>
194 </layout>
195 </parameter>
196 <parameter>
197 <parameterName value="@logger"/>
198 <dbType value="String"/>
199 <size value="255"/>
200 <layout type="log4net.Layout.PatternLayout">
201 <conversionPattern value="%logger"/>
202 </layout>
203 </parameter>
204 <parameter>
205 <parameterName value="@message"/>
206 <dbType value="String"/>
207 <size value="4000"/>
208 <layout type="log4net.Layout.PatternLayout">
209 <conversionPattern value="%message"/>
210 </layout>
211 </parameter>
212 <parameter>
213 <parameterName value="@exception" />
214 <dbType value="String" />
215 <size value="2000" />
216 <layout type="log4net.Layout.ExceptionLayout" />
217 </parameter>
218 </appender>
219
220 <!--sqlite数据库-->
221 <appender name="AdoNetAppender_Sqllite" type="log4net.Appender.AdoNetAppender">
222 <bufferSize value="0"/>
223 <!--2.0这是对应sql2008 如是2000或2005另外配置-->
224 <!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>-->
225 <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
226 <!-- 连接数据库字符串 -->
227 <!--<connectionString value="Data Source=.;Initial Catalog=Log;User ID=sa;Password=123;" />-->
228 <connectionString value="C:\\Users\\Administrator\\Desktop\\log4net\\Log4netExpand\\Test.db3;" />
229 <!-- 插入到表Log -->
230 <commandText value="INSERT INTO MAIN.[Log] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message,@exception)"/>
231
232 <parameter>
233 <parameterName value="@log_date"/>
234 <dbType value="DateTime"/>
235
236 <layout type="log4net.Layout.PatternLayout">
237 <conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
238 </layout>
239 <!-- <layout type="log4net.Layout.RawTimeStampLayout"/>-->
240 </parameter>
241 <parameter>
242 <parameterName value="@thread"/>
243 <dbType value="String"/>
244 <!--<size value="255"/>-->
245 <!-- LogComponent 是类所在的命名空间,MyLayout 是自定义属性所在的类,这是我们自己要写的部分,将在下面介绍。 -->
246 <layout type="log4net.Layout.PatternLayout">
247 <conversionPattern value="%thread"/>
248 </layout>
249 </parameter>
250 <parameter>
251 <parameterName value="@log_level"/>
252 <dbType value="String"/>
253 <!--<size value="50"/>-->
254 <layout type="log4net.Layout.PatternLayout">
255 <conversionPattern value="%level"/>
256 </layout>
257 </parameter>
258 <parameter>
259 <parameterName value="@logger"/>
260 <dbType value="String"/>
261 <!--<size value="255"/>-->
262 <layout type="log4net.Layout.PatternLayout">
263 <conversionPattern value="%logger"/>
264 </layout>
265 </parameter>
266 <parameter>
267 <parameterName value="@message"/>
268 <dbType value="String"/>
269 <!--<size value="4000"/>-->
270 <layout type="log4net.Layout.PatternLayout">
271 <conversionPattern value="%message"/>
272 </layout>
273 </parameter>
274 <parameter>
275 <parameterName value="@exception" />
276 <dbType value="String" />
277 <!--<size value="2000" />-->
278 <layout type="log4net.Layout.ExceptionLayout" />
279 </parameter>
280 </appender>
281 </log4net>
282
283 <system.web>
284 <compilation debug="true" targetFramework="4.0" />
285 </system.web>
286
287 </configuration>

我主要说下里面自定义属性的代码的分别代表意义:

1
2
3
4
5
6
7
8
<parameter>
 96         <parameterName value = "@UserName"/>
 97         <dbType value = "String"/>
 98         <size value = "50"/>
 99         <layout type = "Log4netExpand.MyLayout,log4nettest">
100           <conversionPattern value = "%property{UserName}"/>
101         </layout>
102       </parameter>

其中MyLayout,是我们自己定义的类,下面有介绍;Log4netExpand是这个类的命名空间;log4nettest这个代表是aspx页面的命名空间。注意在此区分。

六、自定义类,这些类呢包含将要插入数据库中的自定义字段

命名空间为 Log4netExpand包含3个类:LogContent.cs、 MyLayout.cs 、MyMessagePatternConverter .cs

1)第一个LogContent类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Log4netExpand
{
/// <summary>
/// 包含了所有的自定字段属性
/// </summary>
public class LogContent
{
/// <summary>
/// 时间类型 均为3
/// </summary>
public int Event_Type { get; set; } /// <summary>
/// 日志分类描述,自定义
/// </summary>
public string EventCategory { get; set; } /// <summary>
/// 日志分类号
/// </summary>
public int Event_ID { get; set; } /// <summary>
/// 计算机IP
/// </summary>
public string ComputerName { get; set; } /// <summary>
/// 计算机Mac 地址
/// </summary>
public string Mac_Address { get; set; } /// <summary>
/// 系统登陆用户
/// </summary>
public string UserName { get; set; } /// <summary>
/// Rier
/// </summary>
public string SourceType { get; set; } /// <summary>
/// Rier Recorder audit
/// </summary>
public string Source { get; set; } /// <summary>
/// 日志描述信息
/// </summary>
public string Description { get; set; } }
}

2)第二个类MyLayout代码如下:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using log4net.Layout;
6
7 namespace Log4netExpand
8 {
9 class MyLayout : PatternLayout
10 {
11 public MyLayout()
12 {
13 this.AddConverter("property", typeof(MyMessagePatternConverter));
14 }
15 }
16 }

3)第三个类MyMessagePatternConverter 代码如下:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Reflection;
6 using log4net.Layout.Pattern;
7
8 namespace Log4netExpand
9 {
10 public class MyMessagePatternConverter : PatternLayoutConverter
11 {
12
13 protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
14 {
15
16 if (Option != null)
17 {
18
19 // Write the value for the specified key
20
21 WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
22
23 }
24
25 else
26 {
27
28 // Write all the key value pairs
29
30 WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
31
32 }
33
34 //if (Option != null)
35
36 //{
37
38 // // Write the value for the specified key
39
40 // WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty(Option));
41
42 //}
43
44 //else
45
46 //{
47
48 // // Write all the key value pairs
49
50 // WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
51
52 //}
53
54 }
55
56
57
58 /// <summary>
59
60 /// 通过反射获取传入的日志对象的某个属性的值
61
62 /// </summary>
63
64 /// <param name="property"></param>
65
66 /// <returns></returns>
67
68 private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
69 {
70
71 object propertyValue = string.Empty;
72
73
74
75 PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
76
77 if (propertyInfo != null)
78
79 propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
80
81
82
83 return propertyValue;
84
85 }
86
87 }
88 }

七、代码页,实现通过log4net把日志(含自定一生属性)添加到数据库

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.UI;
6 using System.Web.UI.WebControls;
7
8 using System.Management;
9 using Log4netExpand;
10
11 namespace Log4netExpand
12 {
13 public partial class test : System.Web.UI.Page
14 {
15 protected void Page_Load(object sender, EventArgs e)
16 {
17
18 }
19 protected void Button1_Click(object sender, EventArgs e)
20 {
21 log4net.ILog log = log4net.LogManager.GetLogger("myLogger");
22
23 LogContent logmodel = new LogContent();
24 logmodel.Event_Type = 3;
25 logmodel.EventCategory = "登陆系统";
26 logmodel.Event_ID = 1;
27 logmodel.ComputerName = Request.UserHostAddress;
28 logmodel.Mac_Address = GetMacAddress();
29 logmodel.Source = "SS";
30 logmodel.SourceType = "1";
31 logmodel.UserName = "ADMIN";
32 logmodel.Description = "TEST";//在记录数据库操作时,可以在petapoco底层将sql语句放入其中。
33 LogHelper.WriteLog(logmodel);
34
35 lbMsg.Text = "数据记录成功!";
36 }
37
38 public string GetMacAddress()
39 {
40 string mac = "";
41 try
42 {
43 //获取网卡硬件地址
44 ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
45 ManagementObjectCollection moc = mc.GetInstances();
46
47 List<string> list = new List<string>();
48
49 foreach (ManagementObject mo in moc)
50 {
51 if ((bool)mo["IPEnabled"] == true)
52 {
53 mac = mo["MacAddress"].ToString();
54
55 list.Add(mac);
56 }
57 }
58 moc = null;
59 mc = null;
60
61 mac = list[list.Count - 1];
62
63 return mac;
64 }
65 catch
66 {
67 return "unknow";
68 }
69 }
70 }
71 }

代码例子源代码: Demo下载

Log4NET简介的更多相关文章

  1. log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  2. Log4net学习

    转自:http://www.cnblogs.com/sirkevin/archive/2012/06/13/2548449.html Log4net简介根据日志类别保存到不同的文件,并按照日期生成不同 ...

  3. Log4Net学习【一】

    如果项目上过线的话,那你一定知道Log是多么重要.为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出L ...

  4. [C#] 我的log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  5. 日志记录组件[Log4net]详细介绍

    转载:http://www.cnblogs.com/liwei6797/archive/2007/04/27/729679.html 因为工作中有要用到Log记录,找到一篇不错的文章,就转了过来. 一 ...

  6. Log4NET 数据库

    阅读目录 Log4NET简介 前提 详细步骤 回到顶部 Log4NET简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种 ...

  7. Log4net日志使用教程-控制台、文本、数据库三种记录方式

    一.log4net简介: 1. Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的 ...

  8. 第一节:框架前期准备篇之Log4Net日志详解

    一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为不同的等级,以不同的格式输出到不同的存储介质中,比如:数据库.t ...

  9. (转)Log4Net 全方位跟踪程序运行

    转自:http://www.cnblogs.com/qingyuan/archive/2011/05/13/2045616.html 前端日子自己写了一个简单的日志跟踪程序,现在目前正在做的一个项目中 ...

随机推荐

  1. 在 tornado 中异步无阻塞的执行耗时任务

    在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...

  2. 【面试题013】在O(1)时间删除链表结点

    [面试题013]在O(1)时间删除链表结点  我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...

  3. How to Enable 64-bit Processes for Enhanced Protected Mode in Internet Explorer 11 (IE11)

       Information Enhanced Protected Mode (EPM) adds additional security to Protected Mode and includes ...

  4. hdu 3790 最短路径问题(最短路,Dijsktra)

    题目 Dijsktra基础题,只是多了一个花费,稍稍变动处理就好 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include&l ...

  5. POJ 3125 Printer Queue(队列,水题)

    题意:有多组数据,每组数据给出n,m,n表示需要打印的文件个数,m表示要打印的目标位置(m为0~n-1).    接下来给出n个数,第i个值对应第i-1个位置的优先级大小.    打印规则如下:    ...

  6. POJ1789Truck History

    题意 : 说实话,题意我没看懂,后来让人给我讲的样例..... 4 aaaaaaa baaaaaa abaaaaa aabaaaa 0 这个样例的话,就是输入n下面n行,每行7个字母,让你依次选两行进 ...

  7. lintcode:Valid Sudoku 判断数独是否合法

    题目: 判断数独是否合法 请判定一个数独是否有效.该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 样例 下列就是一个合法数独的样例. 注意 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...

  8. 创业草堂之十:换位思考:假如你是VC

    前一回“创业草堂”的讲义是一份VC的Termsheet,这里面浓缩着VC投资关键性的理念. 今天来对Termsheet做些实质性的讲解.最有效的学习方法是创业者你亲自来扮演一回VC的角色,学习如何从V ...

  9. 前端自动化工具:Grunt使用教程

    1.下载node.js,然后将node.exe文件所在的目录加入path环境变量 2.安装npm管理工具 2.1.下载npm源码,解压到npm文件夹里,不要把npm放在和node.exe相同的文件夹 ...

  10. Lua for windows中SciTe开启支持python的方法

    打开Options-Open Global Options #import python的#去掉即可