Log4Net使用详解 续

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

说明自从上次在2008年在博客上发表过有关log4net的用法介绍文章之后(网址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx),有不少朋友在博文下留言询问一些细节,现在就一些比较普遍的问题做一些稍微深入的解答,希望大家满意。
首先说明一点的是,log4net解决的问题是提供一个记录日志的框架,它提供了向多种目标写入的实现,比如利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中,一般来说我们只需要提供一个描述性的字符串,然后log4net就会自动提供有关运行时的一些信息。
Log4Net的版本仍是1.2.10(2008年我写博文的时候也是这个版本),有.NET1.0和.NET1.1和.NET2.0版本,如果有正在使用高于.NET2.0开发的也不用担心,可以直接引用这个类库,像在.NET2.0中开发一样,它的网址是:http://logging.apache.org/log4net/
关于在Web中支持的问题
在我们开发项目时都会使用到config文件,可以在config文件中配置log4net。这一点Web项目和WinForm项目都是一样的。需要注意的是,因为在Web项目中一般以较低权限的角色来运行Web项目的,所以在使用文件型日志时要注意不要放在本项目根文件夹之外。
在config文件中的配置

要使用log4net,首先要在config文件的<configSections>节点中增加配置(如果没有这个节点请手动增加),如下:

  1. <configSections>  
  2.     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>  
  3. </configSections>  
<configSections>    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/></configSections>

除此之外,还要在顶级节点<configuration>下增加<log4net>子节点。在<log4net>节点下就可以增加<appender>子节点,每个<appender>子节点代表一种记录日志的方式(仅在这里配置了不代表启用了)。
具体说来有如下Appender:
AdoNetAppender:利用ADO.NET记录到数据库的日志。
AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
ConsoleAppender:将日志输出到控制台。
EventLogAppender:将日志写到Windows Event Log.
FileAppender:将日志写到文件中。
LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下).
MemoryAppender:将日志存到内存缓冲区。
NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。
RemotingAppender:通过.NET Remoting将日志写到远程接收端。
RollingFileAppender:将日志以回滚文件的形式写到文件中。
SmtpAppender:将日志写到邮件中。
TraceAppender:将日志写到.NET trace 系统。
UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
关于使用log4net中可能会使用到的一些参数
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
%f(file):输出语句所在的文件名。
%l(line):输出语句所在的行号。
%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。
下面以一个实际的例子来说明问题,比如在配置中有“%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline”,那么实际的日志中会是如下格式:
“记录时间:2010-11-17 16:16:36,561 线程ID:[9] 日志级别:文件:所在行ERROR 出错类:Log4NetDemo.Program property:[(null)] - 错误描述:error
System.Exception: 在这里发生了一个异常,Error Number:2036084948”
关于对数据库的支持
前面已经说过,log4net是支持包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite在内的数据库的,如果是文件型数据库(如Access或SQLite)的话就需要指定数据库文件的位置(在Web中最好指定在有读写权限的文件夹下,并且实现创建好表),如果是网络数据库就需要指定正确的数据库连接字符串。
比如要记录到Oracle数据库中,在配置文件中可以增加一个< appender>节点,配置如下:

  1. <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">  
  2.       <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
  3.       <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" />  
  4.       <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />  
  5.       <bufferSize value="128" />  
  6.       <parameter>  
  7.         <parameterName value=":log_date" />  
  8.         <dbType value="DateTime" />  
  9.         <layout type="log4net.Layout.RawTimeStampLayout" />  
  10.       </parameter>  
  11.       <parameter>  
  12.         <parameterName value=":thread" />  
  13.         <dbType value="String" />  
  14.         <size value="255" />  
  15.         <layout type="log4net.Layout.PatternLayout">  
  16.           <conversionPattern value="%thread" />  
  17.         </layout>  
  18.       </parameter>  
  19.       <parameter>  
  20.         <parameterName value=":log_level" />  
  21.         <dbType value="String" />  
  22.         <size value="50" />  
  23.         <layout type="log4net.Layout.PatternLayout">  
  24.           <conversionPattern value="%level" />  
  25.         </layout>  
  26.       </parameter>  
  27.       <parameter>  
  28.         <parameterName value=":logger" />  
  29.         <dbType value="String" />  
  30.         <size value="255" />  
  31.         <layout type="log4net.Layout.PatternLayout">  
  32.           <conversionPattern value="%logger" />  
  33.         </layout>  
  34.       </parameter>  
  35.       <parameter>  
  36.         <parameterName value=":message" />  
  37.         <dbType value="String" />  
  38.         <size value="4000" />  
  39.         <layout type="log4net.Layout.PatternLayout">  
  40.           <conversionPattern value="%message" />  
  41.         </layout>  
  42.       </parameter>  
  43.     </appender>  
<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />      <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" />      <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />      <bufferSize value="128" />      <parameter>        <parameterName value=":log_date" />        <dbType value="DateTime" />        <layout type="log4net.Layout.RawTimeStampLayout" />      </parameter>      <parameter>        <parameterName value=":thread" />        <dbType value="String" />        <size value="255" />        <layout type="log4net.Layout.PatternLayout">          <conversionPattern value="%thread" />        </layout>      </parameter>      <parameter>        <parameterName value=":log_level" />        <dbType value="String" />        <size value="50" />        <layout type="log4net.Layout.PatternLayout">          <conversionPattern value="%level" />        </layout>      </parameter>      <parameter>        <parameterName value=":logger" />        <dbType value="String" />        <size value="255" />        <layout type="log4net.Layout.PatternLayout">          <conversionPattern value="%logger" />        </layout>      </parameter>      <parameter>        <parameterName value=":message" />        <dbType value="String" />        <size value="4000" />        <layout type="log4net.Layout.PatternLayout">          <conversionPattern value="%message" />        </layout>      </parameter>    </appender>

当然从上面的配置中的SQL语句中可以看得出这个表的参数,日志表的创建语句如下:

[c-sharp] view plain copy print ?
  1. create table log (  
  2.    Datetime timestamp(3),  
  3.    Thread varchar2(255),  
  4.    Log_Level varchar2(255),  
  5.    Logger varchar2(255),  
  6.    Message varchar2(4000)  
  7.    );  
create table log (   Datetime timestamp(3),   Thread varchar2(255),   Log_Level varchar2(255),   Logger varchar2(255),   Message varchar2(4000)   );

在本例中周公采用了将日志记录到SQLite这个单机数据库的方式,并且还将记录记录日志时的文件名和行号,创建SQLite的SQL语句如下:

[c-sharp] view plain copy print ?
  1. CREATE TABLE Log (  
  2.     LogId        INTEGER PRIMARY KEY,  
  3.     Date        DATETIME NOT NULL,  
  4.     Level        VARCHAR(50) NOT NULL,  
  5.     Logger        VARCHAR(255) NOT NULL,  
  6.     Source        VARCHAR(255) NOT NULL,  
  7.     Message        TEXT DEFAULT NULL  
  8.     );  
CREATE TABLE Log (    LogId        INTEGER PRIMARY KEY,    Date        DATETIME NOT NULL,    Level        VARCHAR(50) NOT NULL,    Logger        VARCHAR(255) NOT NULL,    Source        VARCHAR(255) NOT NULL,    Message        TEXT DEFAULT NULL    );

增加的< appender>节点配置如下:

[c-sharp] view plain copy print ?
  1. <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">  
  2.   <bufferSize value="100" />  
  3.   <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" />  
  4.   <!--SQLite连接字符串-->  
  5.   <connectionString value="Data Source=c://log4net.db;Version=3;" />  
  6.   <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" />  
  7.   <parameter>  
  8.     <parameterName value="@Date" />  
  9.     <dbType value="DateTime" />  
  10.     <layout type="log4net.Layout.RawTimeStampLayout" />  
  11.   </parameter>  
  12.   <parameter>  
  13.     <parameterName value="@Level" />  
  14.     <dbType value="String" />  
  15.     <layout type="log4net.Layout.PatternLayout">  
  16.       <conversionPattern value="%level" />  
  17.     </layout>  
  18.   </parameter>  
  19.   <parameter>  
  20.     <parameterName value="@Logger" />  
  21.     <dbType value="String" />  
  22.     <layout type="log4net.Layout.PatternLayout">  
  23.       <conversionPattern value="%logger" />  
  24.     </layout>  
  25.   </parameter>  
  26.   <parameter>  
  27.     <parameterName value="@Source" />  
  28.     <dbType value="String" />  
  29.     <layout type="log4net.Layout.PatternLayout">  
  30.       <conversionPattern value="%file:%line" />  
  31.     </layout>  
  32.   </parameter>  
  33.   <parameter>  
  34.     <parameterName value="@Message" />  
  35.     <dbType value="String" />  
  36.     <layout type="log4net.Layout.PatternLayout">  
  37.       <conversionPattern value="%message" />  
  38.     </layout>  
  39.   </parameter>  
  40. </appender>  
<appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">  <bufferSize value="100" />  <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" />  <!--SQLite连接字符串-->  <connectionString value="Data Source=c://log4net.db;Version=3;" />  <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" />  <parameter>    <parameterName value="@Date" />    <dbType value="DateTime" />    <layout type="log4net.Layout.RawTimeStampLayout" />  </parameter>  <parameter>    <parameterName value="@Level" />    <dbType value="String" />    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%level" />    </layout>  </parameter>  <parameter>    <parameterName value="@Logger" />    <dbType value="String" />    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%logger" />    </layout>  </parameter>  <parameter>    <parameterName value="@Source" />    <dbType value="String" />    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%file:%line" />    </layout>  </parameter>  <parameter>    <parameterName value="@Message" />    <dbType value="String" />    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%message" />    </layout>  </parameter></appender>

从上面的配置中可以看出插入数据的SQL语句及参数信息,下面的<parameter>节点就是指定插入的数据,比如我们指定SQL语句中的"@Source"参数来源于log4net中的"%file:%line"参数,也就是这两个参数用“:”用连接起来。
控制日志文件大小的问题
对于一个长时间使用并且有大量业务日志的系统来说,如果使用FileAppender将日志一直记录到一个文件中会引起性能低下的问题,我曾见过有个系统的日志文件达到了800多M,最后系统无法及时响应了,在这种情况下可考虑使用RollingFileAppender循环记录日志,一种是指定文件的最大长度,如果超过了就重新生成一个文件,如下面的配置:

  1. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">  
  2.   <file value="RollingFileAppender_log.txt" />  
  3.   <appendToFile value="true" />  
  4.   <rollingStyle value="Size" />  
  5.   <maxSizeRollBackups value="10" />  
  6.   <maximumFileSize value="100KB" />  
  7.   <staticLogFileName value="true" />  
  8.   <layout type="log4net.Layout.PatternLayout">  
  9.     <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />  
  10.   </layout>  
  11. </appender>  
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">  <file value="RollingFileAppender_log.txt" />  <appendToFile value="true" />  <rollingStyle value="Size" />  <maxSizeRollBackups value="10" />  <maximumFileSize value="100KB" />  <staticLogFileName value="true" />  <layout type="log4net.Layout.PatternLayout">    <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />  </layout></appender>

在上面的配置中,每个日志文件最大100KB,最大日志文件个数是10生成的日志文件名会是RollingFileAppender_log.txt.1, RollingFileAppender_log.txt.2 ... RollingFileAppender_log.txt.10,如果记录的日志超过10个,会从RollingFileAppender_log.txt.1开始覆盖。
还有一种方式就是按照日期记录日志,它的配置如下:

  1. <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">  
  2.   <file value="RollingLogFileAppender_DateFormat_log.txt" />  
  3.   <appendToFile value="true" />  
  4.   <rollingStyle value="Date" />  
  5.   <!--<datePattern value="yyyyMMdd-HHmm" />-->  
  6.   <datePattern value="yyyyMMdd" />  
  7.   <layout type="log4net.Layout.PatternLayout">  
  8.     <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />  
  9.   </layout>  
  10. </appender>  
<appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">  <file value="RollingLogFileAppender_DateFormat_log.txt" />  <appendToFile value="true" />  <rollingStyle value="Date" />  <!--<datePattern value="yyyyMMdd-HHmm" />-->  <datePattern value="yyyyMMdd" />  <layout type="log4net.Layout.PatternLayout">    <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />  </layout></appender>

这样一来,每天的日志都写入到一个文件中,当天的日志文件名为“RollingLogFileAppender_DateFormat_log.txt”,非当天的日志都会带上当天的日期,如“RollingLogFileAppender_DateFormat_log.txt20101117”表示2010年11月17日的日志,这样就可以很方便地区分每天的日志了,将来查找起来也相当方便。
在配置中启用和关闭日志
在config文件中可以很方便地关闭和启用日志,就是在<root>进行配置,如下就是一个例子:

  1. <root>  
  2.   <!--文件形式记录日志-->  
  3.   <appender-ref ref="LogFileAppender" />  
  4.   <!--控制台控制显示日志-->  
  5.   <appender-ref ref="ConsoleAppender" />  
  6.   <!--Windows事件日志-->  
  7.   <!--<appender-ref ref="EventLogAppender" />-->  
  8.   <!--SQLite事件日志-->  
  9.   <appender-ref ref="AdoNetAppender_SQLite" />  
  10.   <!--RollingFileAppender事件日志-->  
  11.   <appender-ref ref="RollingFileAppender" />  
  12.   <!--RollingFileAppender事件日志,每天一个日志-->  
  13.   <appender-ref ref="RollingLogFileAppender_DateFormat" />  
  14.   <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉  
  15.   <appender-ref ref="AdoNetAppender_Access" />  
  16.   -->  
  17. </root>  
<root>  <!--文件形式记录日志-->  <appender-ref ref="LogFileAppender" />  <!--控制台控制显示日志-->  <appender-ref ref="ConsoleAppender" />  <!--Windows事件日志-->  <!--<appender-ref ref="EventLogAppender" />-->  <!--SQLite事件日志-->  <appender-ref ref="AdoNetAppender_SQLite" />  <!--RollingFileAppender事件日志-->  <appender-ref ref="RollingFileAppender" />  <!--RollingFileAppender事件日志,每天一个日志-->  <appender-ref ref="RollingLogFileAppender_DateFormat" />  <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉  <appender-ref ref="AdoNetAppender_Access" />  --></root>

在上面的例子中可以看出,如果想增加日志输出目的地,增加<appender-ref>节点就是了,注意后面的ref是在config中配置的appender name,如果想要取消,删除或者注释掉这行就可以了。
Log4Net的使用
首先要添加config文件,在类库项目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。
下面是一个在WinForm项目中的使用Log4Net的例子:

[c-sharp] view plain copy print ?
  1. using System.Collections.Generic;  
  2. using System.Text;  
  3. using log4net;  
  4. using System.Reflection;  
  5.   
  6. //注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息  
  7. //如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件)  
  8. //如果是WebForm,则从web.config中读取相关信息  
  9. [assembly: log4net.Config.XmlConfigurator(Watch = true)]  
  10. namespace Log4NetDemo  
  11. {  
  12.     class Program  
  13.     {  
  14.         static void Main(string[] args)  
  15.         {  
  16.             Random random = new Random();  
  17.             for (int i = 0; i < 1; i++)  
  18.             {  
  19.                 //创建日志记录组件实例  
  20.                 //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);  
  21.   
  22.                 ILog log=log4net.LogManager.GetLogger(typeof(Program));  
  23.                 //记录错误日志  
  24.                 //log.Error("error", new Exception("在这里发生了一个异常,Error Number:"+random.Next()));  
  25.                 //记录严重错误  
  26.                 //log.Fatal("fatal", new Exception("在发生了一个致命错误,Exception Id:"+random.Next()));  
  27.                 //记录一般信息  
  28.                 //log.Info("提示:系统正在运行");  
  29.                 //记录调试信息  
  30.                 //log.Debug("调试信息:debug");  
  31.                 //记录警告信息  
  32.                 //log.Warn("警告:warn");  
  33.             }  
  34.             Console.WriteLine("日志记录完毕。");  
  35.             Console.Read();  
  36.   
  37.         }  
  38.     }  
  39. }  
using System.Collections.Generic;using System.Text;using log4net;using System.Reflection;//注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息//如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件)//如果是WebForm,则从web.config中读取相关信息[assembly: log4net.Config.XmlConfigurator(Watch = true)]namespace Log4NetDemo{    class Program    {        static void Main(string[] args)        {            Random random = new Random();            for (int i = 0; i < 1; i++)            {                //创建日志记录组件实例                //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);                ILog log=log4net.LogManager.GetLogger(typeof(Program));                //记录错误日志                //log.Error("error", new Exception("在这里发生了一个异常,Error Number:"+random.Next()));                //记录严重错误                //log.Fatal("fatal", new Exception("在发生了一个致命错误,Exception Id:"+random.Next()));                //记录一般信息                //log.Info("提示:系统正在运行");                //记录调试信息                //log.Debug("调试信息:debug");                //记录警告信息                //log.Warn("警告:warn");            }            Console.WriteLine("日志记录完毕。");            Console.Read();        }    }}

在WebForm中也可以使用Log4net,下面是一个在ASP.NET中使用Log4Net的例子:

[c-sharp] view plain copy print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Web;  
  4. using System.Web.UI;  
  5. using System.Web.UI.WebControls;  
  6. using log4net;  
  7. using System.Reflection;  
  8.   
  9. //如果是web项目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure();   
  10. [assembly: log4net.Config.XmlConfigurator(Watch = true)]  
  11. public partial class _Default : System.Web.UI.Page   
  12. {  
  13.     protected void Page_Load(object sender, EventArgs e)  
  14.     {  
  15.         if (!Page.IsPostBack)  
  16.         {  
  17.             Random random = new Random();  
  18.             for (int i = 0; i < 1; i++)  
  19.             {  
  20.                 //创建日志记录组件实例  
  21.                 ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);  
  22.   
  23.                 //ILog log = log4net.LogManager.GetLogger(typeof(Program));  
  24.                 //记录错误日志  
  25.                 //log.Error("error", new Exception("在这里发生了一个异常,Error Number:"+random.Next()));  
  26.                 //记录严重错误  
  27.                 //log.Fatal("fatal", new Exception("在发生了一个致命错误,Exception Id:"+random.Next()));  
  28.                 //记录一般信息  
  29.                 //log.Info("提示:系统正在运行");  
  30.                 //记录调试信息  
  31.                 //log.Debug("调试信息:debug");  
  32.                 //记录警告信息  
  33.                 log.Warn("警告:warn");  
  34.                 Response.Write("日志记录完毕。");  
  35.             }  
  36.         }  
  37.     }  
  38. }  
using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using log4net;using System.Reflection;//如果是web项目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure(); [assembly: log4net.Config.XmlConfigurator(Watch = true)]public partial class _Default : System.Web.UI.Page {    protected void Page_Load(object sender, EventArgs e)    {        if (!Page.IsPostBack)        {            Random random = new Random();            for (int i = 0; i < 1; i++)            {                //创建日志记录组件实例                ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);                //ILog log = log4net.LogManager.GetLogger(typeof(Program));                //记录错误日志                //log.Error("error", new Exception("在这里发生了一个异常,Error Number:"+random.Next()));                //记录严重错误                //log.Fatal("fatal", new Exception("在发生了一个致命错误,Exception Id:"+random.Next()));                //记录一般信息                //log.Info("提示:系统正在运行");                //记录调试信息                //log.Debug("调试信息:debug");                //记录警告信息                log.Warn("警告:warn");                Response.Write("日志记录完毕。");            }        }    }}

可以看出它们的代码基本没有区别。

下面是一个在WinForm下的config文件的完整配置,该配置文件所使用的代码就是在上面所使用到的代码,使用LogFileAppender、ConsoleAppender、EventLogAppender、AdoNetAppender_SQLite、RollingFileAppender、RollingLogFileAppender_DateFormat方式记录日志都在本地通过测试。完整的config文件代码如下:

  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <configSections>  
  4.     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>  
  5.   </configSections>  
  6.   <appSettings>  
  7.     <!-- To enable internal log4net logging specify the   
  8.              following appSettings key -->  
  9.      <add key="log4net.Internal.Debug" value="true"/>   
  10.   </appSettings>  
  11.   <log4net>  
  12.     <!--定义输出到文件中-->  
  13.     <appender name="LogFileAppender" type="log4net.Appender.FileAppender">  
  14.       <!--每条日志末尾的文字说明-->  
  15.       <footer value="by 周公" />  
  16.       <!--定义文件存放位置-->  
  17.       <file value="LogFileAppender_log.txt" />  
  18.       <appendToFile value="true" />  
  19.       <datePattern value="yyyyMMdd-HH:mm:ss" />  
  20.       <layout type="log4net.Layout.PatternLayout">  
  21.         <!--每条日志末尾的文字说明-->  
  22.         <footer value="by 周公" />  
  23.         <!--输出格式-->  
  24.         <!--样例:2010-11-17 15:50:23,443 [9] (D:/CSProjects/Log4NetDemo/Log4NetDemo/Program.cs:27) FATAL Log4NetDemo.Program [(null)] - fatal  
  25. System.Exception: 在发生了一个致命错误,Exception Id:548828745-->  
  26.         <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:文件:所在行%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />  
  27.       </layout>  
  28.     </appender>  
  29.     <!--定义输出到控制台命令行中-->  
  30.     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">  
  31.       <layout type="log4net.Layout.PatternLayout">  
  32.         <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />  
  33.       </layout>  
  34.     </appender>  
  35.     <!--使用Rolling方式记录日志  
  36.     每个日志文件最大100KB,生成的日志文件名会是log.txt.1,log.txt.2 ...log.txt.10  
  37.     如果记录的日志超过10个,会从log.txt.1开始覆盖  
  38.     -->  
  39. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">  
  40.   <file value="RollingFileAppender_log.txt" />  
  41.   <appendToFile value="true" />  
  42.   <rollingStyle value="Size" />  
  43.   <maxSizeRollBackups value="10" />  
  44.   <maximumFileSize value="100KB" />  
  45.   <staticLogFileName value="true" />  
  46.   <layout type="log4net.Layout.PatternLayout">  
  47.     <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />  
  48.   </layout>  
  49. </appender>  
  50.     <!--使用Rolling方式记录日志  
  51.     按照日来记录日志  
  52.     -->  
  53. <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">  
  54.   <file value="RollingLogFileAppender_DateFormat_log.txt" />  
  55.   <appendToFile value="true" />  
  56.   <rollingStyle value="Date" />  
  57.   <!--<datePattern value="yyyyMMdd-HHmm" />-->  
  58.   <datePattern value="yyyyMMdd" />  
  59.   <layout type="log4net.Layout.PatternLayout">  
  60.     <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />  
  61.   </layout>  
  62. </appender>  
  63.   
  64.     <!--记录到SQLite这样的单机数据库中去  
  65.     创SQLite表的SQL语句:  
  66.     CREATE TABLE Log (  
  67.     LogId        INTEGER PRIMARY KEY,  
  68.     Date        DATETIME NOT NULL,  
  69.     Level        VARCHAR(50) NOT NULL,  
  70.     Logger        VARCHAR(255) NOT NULL,  
  71.     Source        VARCHAR(255) NOT NULL,  
  72.     Message        TEXT DEFAULT NULL  
  73.     );  
  74.     -->  
  75. <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">  
  76.   <bufferSize value="100" />  
  77.   <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" />  
  78.   <!--SQLite连接字符串-->  
  79.   <connectionString value="Data Source=c://log4net.db;Version=3;" />  
  80.   <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" />  
  81.   <parameter>  
  82.     <parameterName value="@Date" />  
  83.     <dbType value="DateTime" />  
  84.     <layout type="log4net.Layout.RawTimeStampLayout" />  
  85.   </parameter>  
  86.   <parameter>  
  87.     <parameterName value="@Level" />  
  88.     <dbType value="String" />  
  89.     <layout type="log4net.Layout.PatternLayout">  
  90.       <conversionPattern value="%level" />  
  91.     </layout>  
  92.   </parameter>  
  93.   <parameter>  
  94.     <parameterName value="@Logger" />  
  95.     <dbType value="String" />  
  96.     <layout type="log4net.Layout.PatternLayout">  
  97.       <conversionPattern value="%logger" />  
  98.     </layout>  
  99.   </parameter>  
  100.   <parameter>  
  101.     <parameterName value="@Source" />  
  102.     <dbType value="String" />  
  103.     <layout type="log4net.Layout.PatternLayout">  
  104.       <conversionPattern value="%file:%line" />  
  105.     </layout>  
  106.   </parameter>  
  107.   <parameter>  
  108.     <parameterName value="@Message" />  
  109.     <dbType value="String" />  
  110.     <layout type="log4net.Layout.PatternLayout">  
  111.       <conversionPattern value="%message" />  
  112.     </layout>  
  113.   </parameter>  
  114. </appender>  
  115.     <!--定义输出到SQL Server数据库中-->  
  116.     <!--  
  117.     在SQL Server中创建表的SQL语句  
  118.     CREATE TABLE [dbo].[Log] (  
  119.     [Id] [int] IDENTITY (1, 1) NOT NULL,  
  120.     [Date] [datetime] NOT NULL,  
  121.     [Thread] [varchar] (255) NOT NULL,  
  122.     [Level] [varchar] (50) NOT NULL,  
  123.     [Logger] [varchar] (255) NOT NULL,  
  124.     [Message] [varchar] (4000) NOT NULL,  
  125.     [Exception] [varchar] (2000) NULL  
  126. );  
  127.     -->  
  128.     <appender name="AdoNetAppender_SQLServer" type="log4net.Appender.AdoNetAppender">  
  129.       <bufferSize value="100" />  
  130.       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />  
  131.       <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />  
  132.       <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />  
  133.       <parameter>  
  134.         <parameterName value="@log_date" />  
  135.         <dbType value="DateTime" />  
  136.         <layout type="log4net.Layout.RawTimeStampLayout" />  
  137.       </parameter>  
  138.       <parameter>  
  139.         <parameterName value="@thread" />  
  140.         <dbType value="String" />  
  141.         <size value="255" />  
  142.         <layout type="log4net.Layout.PatternLayout">  
  143.           <conversionPattern value="%thread" />  
  144.         </layout>  
  145.       </parameter>  
  146.       <parameter>  
  147.         <parameterName value="@log_level" />  
  148.         <dbType value="String" />  
  149.         <size value="50" />  
  150.         <layout type="log4net.Layout.PatternLayout">  
  151.           <conversionPattern value="%level" />  
  152.         </layout>  
  153.       </parameter>  
  154.       <parameter>  
  155.         <parameterName value="@logger" />  
  156.         <dbType value="String" />

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block var foo = 'bar'; 

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值