Log4Net使用详解(续)

摘要:
例如,log4net可用于轻松地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MSSQLServer、//loging.apache.org/log4net/对于Web支持的问题,我们将在开发项目时使用配置文件,因此在使用文件类型日志时,请注意不要将其放在项目的根文件夹之外;

说明自从上次在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.     <sectionname="log4net"type="System.Configuration.IgnoreSectionHandler"/> 
  3. </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. <appendername="AdoNetAppender_Oracle"type="log4net.Appender.AdoNetAppender"> 
  2.       <connectionTypevalue="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
  3.       <connectionStringvalue="data source=[mydatabase];User ID=[user];Password=[password]"/> 
  4.       <commandTextvalue="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)"/> 
  5.       <bufferSizevalue="128"/> 
  6.       <parameter> 
  7.         <parameterNamevalue=":log_date"/> 
  8.         <dbTypevalue="DateTime"/> 
  9.         <layouttype="log4net.Layout.RawTimeStampLayout"/> 
  10.       </parameter> 
  11.       <parameter> 
  12.         <parameterNamevalue=":thread"/> 
  13.         <dbTypevalue="String"/> 
  14.         <sizevalue="255"/> 
  15.         <layouttype="log4net.Layout.PatternLayout"> 
  16.           <conversionPatternvalue="%thread"/> 
  17.         </layout> 
  18.       </parameter> 
  19.       <parameter> 
  20.         <parameterNamevalue=":log_level"/> 
  21.         <dbTypevalue="String"/> 
  22.         <sizevalue="50"/> 
  23.         <layouttype="log4net.Layout.PatternLayout"> 
  24.           <conversionPatternvalue="%level"/> 
  25.         </layout> 
  26.       </parameter> 
  27.       <parameter> 
  28.         <parameterNamevalue=":logger"/> 
  29.         <dbTypevalue="String"/> 
  30.         <sizevalue="255"/> 
  31.         <layouttype="log4net.Layout.PatternLayout"> 
  32.           <conversionPatternvalue="%logger"/> 
  33.         </layout> 
  34.       </parameter> 
  35.       <parameter> 
  36.         <parameterNamevalue=":message"/> 
  37.         <dbTypevalue="String"/> 
  38.         <sizevalue="4000"/> 
  39.         <layouttype="log4net.Layout.PatternLayout"> 
  40.           <conversionPatternvalue="%message"/> 
  41.         </layout> 
  42.       </parameter> 
  43.     </appender> 

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

  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.    ); 

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

  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.     ); 

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

  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> 

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

  1. <appendername="RollingFileAppender"type="log4net.Appender.RollingFileAppender"> 
  2.   <filevalue="RollingFileAppender_log.txt"/> 
  3.   <appendToFilevalue="true"/> 
  4.   <rollingStylevalue="Size"/> 
  5.   <maxSizeRollBackupsvalue="10"/> 
  6.   <maximumFileSizevalue="100KB"/> 
  7.   <staticLogFileNamevalue="true"/> 
  8.   <layouttype="log4net.Layout.PatternLayout"> 
  9.     <conversionPatternvalue="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline"/> 
  10.   </layout> 
  11. </appender> 

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

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

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

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

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

  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.     class Program 
  12.     { 
  13.         staticvoid Main(string[] args) 
  14.         { 
  15.             Random random = new Random(); 
  16.             for (int i = 0; i < 1; i++) 
  17.             { 
  18.                 //创建日志记录组件实例 
  19.                 //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
  20.  
  21.                 ILog log=log4net.LogManager.GetLogger(typeof(Program)); 
  22.                 //记录错误日志 
  23.                 //log.Error("error", new Exception("在这里发生了一个异常,Error Number:"+random.Next())); 
  24.                 //记录严重错误 
  25.                 //log.Fatal("fatal", new Exception("在发生了一个致命错误,Exception Id:"+random.Next())); 
  26.                 //记录一般信息 
  27.                 //log.Info("提示:系统正在运行"); 
  28.                 //记录调试信息 
  29.                 //log.Debug("调试信息:debug"); 
  30.                 //记录警告信息 
  31.                 //log.Warn("警告:warn"); 
  32.             } 
  33.             Console.WriteLine("日志记录完毕。"); 
  34.             Console.Read(); 
  35.  
  36.         } 
  37.     } 

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

  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.     protectedvoid Page_Load(object sender, EventArgs e) 
  13.     { 
  14.         if (!Page.IsPostBack) 
  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.                 Response.Write("日志记录完毕。"); 
  34.             } 
  35.         } 
  36.     } 

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

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

  1. <?xmlversion="1.0"encoding="utf-8"?> 
  2. <configuration> 
  3.   <configSections> 
  4.     <sectionname="log4net"type="System.Configuration.IgnoreSectionHandler"/> 
  5.   </configSections> 
  6.   <appSettings> 
  7.     <!-- To enable internal log4net logging specify the  
  8.              following appSettings key --> 
  9.      <addkey="log4net.Internal.Debug"value="true"/>  
  10.   </appSettings> 
  11.   <log4net> 
  12.     <!--定义输出到文件中--> 
  13.     <appendername="LogFileAppender"type="log4net.Appender.FileAppender"> 
  14.       <!--每条日志末尾的文字说明--> 
  15.       <footervalue="by 周公"/> 
  16.       <!--定义文件存放位置--> 
  17.       <filevalue="LogFileAppender_log.txt"/> 
  18.       <appendToFilevalue="true"/> 
  19.       <datePatternvalue="yyyyMMdd-HH:mm:ss"/> 
  20.       <layouttype="log4net.Layout.PatternLayout"> 
  21.         <!--每条日志末尾的文字说明--> 
  22.         <footervalue="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.         <conversionPatternvalue="记录时间:%date 线程ID:[%thread] 日志级别:文件:所在行%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline"/> 
  27.       </layout> 
  28.     </appender> 
  29.     <!--定义输出到控制台命令行中--> 
  30.     <appendername="ConsoleAppender"type="log4net.Appender.ConsoleAppender"> 
  31.       <layouttype="log4net.Layout.PatternLayout"> 
  32.         <conversionPatternvalue="%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. <appendername="RollingFileAppender"type="log4net.Appender.RollingFileAppender"> 
  40.   <filevalue="RollingFileAppender_log.txt"/> 
  41.   <appendToFilevalue="true"/> 
  42.   <rollingStylevalue="Size"/> 
  43.   <maxSizeRollBackupsvalue="10"/> 
  44.   <maximumFileSizevalue="100KB"/> 
  45.   <staticLogFileNamevalue="true"/> 
  46.   <layouttype="log4net.Layout.PatternLayout"> 
  47.     <conversionPatternvalue="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline"/> 
  48.   </layout> 
  49. </appender> 
  50.     <!--使用Rolling方式记录日志 
  51.     按照日来记录日志 
  52.     --> 
  53. <appendername="RollingLogFileAppender_DateFormat"type="log4net.Appender.RollingFileAppender"> 
  54.   <filevalue="RollingLogFileAppender_DateFormat_log.txt"/> 
  55.   <appendToFilevalue="true"/> 
  56.   <rollingStylevalue="Date"/> 
  57.   <!--<datePattern value="yyyyMMdd-HHmm" />--> 
  58.   <datePatternvalue="yyyyMMdd"/> 
  59.   <layouttype="log4net.Layout.PatternLayout"> 
  60.     <conversionPatternvalue="%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. <appendername="AdoNetAppender_SQLite"type="log4net.Appender.AdoNetAppender"> 
  76.   <bufferSizevalue="100"/> 
  77.   <connectionTypevalue="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral"/> 
  78.   <!--SQLite连接字符串--> 
  79.   <connectionStringvalue="Data Source=c://log4net.db;Version=3;"/> 
  80.   <commandTextvalue="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)"/> 
  81.   <parameter> 
  82.     <parameterNamevalue="@Date"/> 
  83.     <dbTypevalue="DateTime"/> 
  84.     <layouttype="log4net.Layout.RawTimeStampLayout"/> 
  85.   </parameter> 
  86.   <parameter> 
  87.     <parameterNamevalue="@Level"/> 
  88.     <dbTypevalue="String"/> 
  89.     <layouttype="log4net.Layout.PatternLayout"> 
  90.       <conversionPatternvalue="%level"/> 
  91.     </layout> 
  92.   </parameter> 
  93.   <parameter> 
  94.     <parameterNamevalue="@Logger"/> 
  95.     <dbTypevalue="String"/> 
  96.     <layouttype="log4net.Layout.PatternLayout"> 
  97.       <conversionPatternvalue="%logger"/> 
  98.     </layout> 
  99.   </parameter> 
  100.   <parameter> 
  101.     <parameterNamevalue="@Source"/> 
  102.     <dbTypevalue="String"/> 
  103.     <layouttype="log4net.Layout.PatternLayout"> 
  104.       <conversionPatternvalue="%file:%line"/> 
  105.     </layout> 
  106.   </parameter> 
  107.   <parameter> 
  108.     <parameterNamevalue="@Message"/> 
  109.     <dbTypevalue="String"/> 
  110.     <layouttype="log4net.Layout.PatternLayout"> 
  111.       <conversionPatternvalue="%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.     <appendername="AdoNetAppender_SQLServer"type="log4net.Appender.AdoNetAppender"> 
  129.       <bufferSizevalue="100"/> 
  130.       <connectionTypevalue="System.Data.SqlClient.SqlConnection, System.Data"/> 
  131.       <connectionStringvalue="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]"/> 
  132.       <commandTextvalue="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"/> 
  133.       <parameter> 
  134.         <parameterNamevalue="@log_date"/> 
  135.         <dbTypevalue="DateTime"/> 
  136.         <layouttype="log4net.Layout.RawTimeStampLayout"/> 
  137.       </parameter> 
  138.       <parameter> 
  139.         <parameterNamevalue="@thread"/> 
  140.         <dbTypevalue="String"/> 
  141.         <sizevalue="255"/> 
  142.         <layouttype="log4net.Layout.PatternLayout"> 
  143.           <conversionPatternvalue="%thread"/> 
  144.         </layout> 
  145.       </parameter> 
  146.       <parameter> 
  147.         <parameterNamevalue="@log_level"/> 
  148.         <dbTypevalue="String"/> 
  149.         <sizevalue="50"/> 
  150.         <layouttype="log4net.Layout.PatternLayout"> 
  151.           <conversionPatternvalue="%level"/> 
  152.         </layout> 
  153.       </parameter> 
  154.       <parameter> 
  155.         <parameterNamevalue="@logger"/> 
  156.         <dbTypevalue="String"/> 
  157.         <sizevalue="255"/> 
  158.         <layouttype="log4net.Layout.PatternLayout"> 
  159.           <conversionPatternvalue="%logger"/> 
  160.         </layout> 
  161.       </parameter> 
  162.       <parameter> 
  163.         <parameterNamevalue="@message"/> 
  164.         <dbTypevalue="String"/> 
  165.         <sizevalue="4000"/> 
  166.         <layouttype="log4net.Layout.PatternLayout"> 
  167.           <conversionPatternvalue="%message"/> 
  168.         </layout> 
  169.       </parameter> 
  170.       <parameter> 
  171.         <parameterNamevalue="@exception"/> 
  172.         <dbTypevalue="String"/> 
  173.         <sizevalue="2000"/> 
  174.         <layouttype="log4net.Layout.ExceptionLayout"/> 
  175.       </parameter> 
  176.     </appender> 
  177.     <!--定义输出到Oracle9i中--> 
  178.     <!-- 
  179.     在Oracle9i中创建表的SQL语句 
  180.     create table log ( 
  181.    Datetime timestamp(3), 
  182.    Thread varchar2(255), 
  183.    Log_Level varchar2(255), 
  184.    Logger varchar2(255), 
  185.    Message varchar2(4000) 
  186.    ); 
  187.     --> 
  188.     <appendername="AdoNetAppender_Oracle"type="log4net.Appender.AdoNetAppender"> 
  189.       <connectionTypevalue="System.Data.OracleClient.OracleConnection, System.Data.OracleClient"/> 
  190.       <connectionStringvalue="data source=[mydatabase];User ID=[user];Password=[password]"/> 
  191.       <commandTextvalue="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)"/> 
  192.       <bufferSizevalue="128"/> 
  193.       <parameter> 
  194.         <parameterNamevalue=":log_date"/> 
  195.         <dbTypevalue="DateTime"/> 
  196.         <layouttype="log4net.Layout.RawTimeStampLayout"/> 
  197.       </parameter> 
  198.       <parameter> 
  199.         <parameterNamevalue=":thread"/> 
  200.         <dbTypevalue="String"/> 
  201.         <sizevalue="255"/> 
  202.         <layouttype="log4net.Layout.PatternLayout"> 
  203.           <conversionPatternvalue="%thread"/> 
  204.         </layout> 
  205.       </parameter> 
  206.       <parameter> 
  207.         <parameterNamevalue=":log_level"/> 
  208.         <dbTypevalue="String"/> 
  209.         <sizevalue="50"/> 
  210.         <layouttype="log4net.Layout.PatternLayout"> 
  211.           <conversionPatternvalue="%level"/> 
  212.         </layout> 
  213.       </parameter> 
  214.       <parameter> 
  215.         <parameterNamevalue=":logger"/> 
  216.         <dbTypevalue="String"/> 
  217.         <sizevalue="255"/> 
  218.         <layouttype="log4net.Layout.PatternLayout"> 
  219.           <conversionPatternvalue="%logger"/> 
  220.         </layout> 
  221.       </parameter> 
  222.       <parameter> 
  223.         <parameterNamevalue=":message"/> 
  224.         <dbTypevalue="String"/> 
  225.         <sizevalue="4000"/> 
  226.         <layouttype="log4net.Layout.PatternLayout"> 
  227.           <conversionPatternvalue="%message"/> 
  228.         </layout> 
  229.       </parameter> 
  230.     </appender> 
  231.     <!--定义输出到IBM DB2中--> 
  232.     <!-- 
  233.     在DB2中创建表的SQL语句 
  234.     CREATE TABLE "myschema.LOG" ( 
  235.     "ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY ( 
  236.         START WITH +1 
  237.         INCREMENT BY +1 
  238.         MINVALUE +1 
  239.         MAXVALUE +2147483647 
  240.         NO CYCLE 
  241.         NO CACHE 
  242.         NO ORDER 
  243.     ), 
  244.     "DATE" TIMESTAMP NOT NULL, 
  245.     "THREAD" VARCHAR(255) NOT NULL, 
  246.     "LEVEL" VARCHAR(500) NOT NULL, 
  247.     "LOGGER" VARCHAR(255) NOT NULL, 
  248.     "MESSAGE" VARCHAR(4000) NOT NULL, 
  249.     "EXCEPTION" VARCHAR(2000) 
  250. IN "LRGTABLES"; 
  251.     --> 
  252.     <appendername="AdoNetAppender_DB2"type="log4net.Appender.AdoNetAppender"> 
  253.       <bufferSizevalue="100"/> 
  254.       <connectionTypevalue="IBM.Data.DB2.DB2Connection,IBM.Data.DB2"/> 
  255.       <connectionStringvalue="server=192.168.0.0;database=dbuser;user Id=username;password=password;persist security info=true"/> 
  256.       <commandTextvalue="INSERT INTO myschema.Log (Date,Thread,Level,Logger,Message,Exception) VALUES (@log_date,@thread,@log_level,@logger,@message,@exception)"/> 
  257.       <parameter> 
  258.         <parameterNamevalue="@log_date"/> 
  259.         <dbTypevalue="DateTime"/> 
  260.         <layouttype="log4net.Layout.RawTimeStampLayout"/> 
  261.       </parameter> 
  262.       <parameter> 
  263.         <parameterNamevalue="@thread"/> 
  264.         <dbTypevalue="String"/> 
  265.         <sizevalue="255"/> 
  266.         <layouttype="log4net.Layout.PatternLayout"> 
  267.           <conversionPatternvalue="%thread"/> 
  268.         </layout> 
  269.       </parameter> 
  270.       <parameter> 
  271.         <parameterNamevalue="@log_level"/> 
  272.         <dbTypevalue="String"/> 
  273.         <sizevalue="500"/> 
  274.         <layouttype="log4net.Layout.PatternLayout"> 
  275.           <conversionPatternvalue="%level"/> 
  276.         </layout> 
  277.       </parameter> 
  278.       <parameter> 
  279.         <parameterNamevalue="@logger"/> 
  280.         <dbTypevalue="String"/> 
  281.         <sizevalue="255"/> 
  282.         <layouttype="log4net.Layout.PatternLayout"> 
  283.           <conversionPatternvalue="%logger"/> 
  284.         </layout> 
  285.       </parameter> 
  286.       <parameter> 
  287.         <parameterNamevalue="@message"/> 
  288.         <dbTypevalue="String"/> 
  289.         <sizevalue="4000"/> 
  290.         <layouttype="log4net.Layout.PatternLayout"> 
  291.           <conversionPatternvalue="%message"/> 
  292.         </layout> 
  293.       </parameter> 
  294.       <parameter> 
  295.         <parameterNamevalue="@exception"/> 
  296.         <dbTypevalue="String"/> 
  297.         <sizevalue="2000"/> 
  298.         <layouttype="log4net.Layout.ExceptionLayout"/> 
  299.       </parameter> 
  300.     </appender> 
  301.     <!--定义输出到windows事件中--> 
  302.     <appendername="EventLogAppender"type="log4net.Appender.EventLogAppender"> 
  303.       <layouttype="log4net.Layout.PatternLayout"> 
  304.         <conversionPatternvalue="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> 
  305.       </layout> 
  306.     </appender> 
  307.     <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb 
  308.     创建Access表的SQL语句: 
  309.     --> 
  310.     <appendername="AdoNetAppender_Access"type="log4net.Appender.AdoNetAppender"> 
  311.       <connectionStringvalue="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/log4net.mdb"/> 
  312.       <commandTextvalue="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)"/> 
  313.       <!--定义各个参数--> 
  314.       <parameter> 
  315.         <parameterNamevalue="@logDate"/> 
  316.         <dbTypevalue="String"/> 
  317.         <sizevalue="240"/> 
  318.         <layouttype="log4net.Layout.PatternLayout"> 
  319.           <conversionPatternvalue="%date"/> 
  320.         </layout> 
  321.       </parameter> 
  322.       <parameter> 
  323.         <parameterNamevalue="@thread"/> 
  324.         <dbTypevalue="String"/> 
  325.         <sizevalue="240"/> 
  326.         <layouttype="log4net.Layout.PatternLayout"> 
  327.           <conversionPatternvalue="%thread"/> 
  328.         </layout> 
  329.       </parameter> 
  330.       <parameter> 
  331.         <parameterNamevalue="@logLevel"/> 
  332.         <dbTypevalue="String"/> 
  333.         <sizevalue="240"/> 
  334.         <layouttype="log4net.Layout.PatternLayout"> 
  335.           <conversionPatternvalue="%level"/> 
  336.         </layout> 
  337.       </parameter> 
  338.       <parameter> 
  339.         <parameterNamevalue="@logger"/> 
  340.         <dbTypevalue="String"/> 
  341.         <sizevalue="240"/> 
  342.         <layouttype="log4net.Layout.PatternLayout"> 
  343.           <conversionPatternvalue="%logger"/> 
  344.         </layout> 
  345.       </parameter> 
  346.       <parameter> 
  347.         <parameterNamevalue="@message"/> 
  348.         <dbTypevalue="String"/> 
  349.         <sizevalue="240"/> 
  350.         <layouttype="log4net.Layout.PatternLayout"> 
  351.           <conversionPatternvalue="%message"/> 
  352.         </layout> 
  353.       </parameter> 
  354.     </appender> 
  355.     <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。--> 
  356. <root> 
  357.   <!--文件形式记录日志--> 
  358.   <appender-refref="LogFileAppender"/> 
  359.   <!--控制台控制显示日志--> 
  360.   <appender-refref="ConsoleAppender"/> 
  361.   <!--Windows事件日志--> 
  362.   <!--<appender-ref ref="EventLogAppender" />--> 
  363.   <!--SQLite日志--> 
  364.   <!--<appender-ref ref="AdoNetAppender_SQLite" />--> 
  365.   <!--RollingFileAppender事件日志--> 
  366.   <appender-refref="RollingFileAppender"/> 
  367.   <!--RollingFileAppender事件日志,每天一个日志--> 
  368.   <appender-refref="RollingLogFileAppender_DateFormat"/> 
  369.   <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉 
  370.   <appender-refref="AdoNetAppender_Access"/> 
  371.   --> 
  372. </root> 
  373.  
  374.   </log4net> 
  375.   <!--<system.diagnostics> 
  376.     <traceautoflush="true"> 
  377.       <listeners> 
  378.         <add 
  379.             name="textWriterTraceListener" 
  380.             type="System.Diagnostics.TextWriterTraceListener" 
  381.             initializeData="D:/CSProjects/Log4NetDemo/Log4NetDemo/bin/log4net.txt"/> 
  382.       </listeners> 
  383.     </trace> 
  384.   </system.diagnostics>--> 
  385.  
  386. </configuration> 

总结:

本篇主要是补充在上一篇关于Log4Net中未尽之处,并集中详尽回答了一些朋友在该篇博文下的提问,如有未尽之处,请在本篇下留言。如有初学者碰巧路过不知config文件为何物,请看《asp.net夜话之十一:web.config详解》,网址是:http://blog.csdn.net/zhoufoxcn/archive/2008/11/10/3265141.aspx

免责声明:文章转载自《Log4Net使用详解(续)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#开源大全Jsp页面跳转和js控制页面跳转的几种方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mac Terminal菜鸟篇之使用unrar解压rar文件

在Mac上的归档工具不能够解压rar文件,这时可以使用终端中的unrar来解决问题。 步骤如下: 1.使用Homebrew安装unrar(有关Homebrew的安装和使用见Homebrew) [plain] view plain copy  $ brew install unrar   ==> Downloading http://www.r...

PowerShell初探

Windows PowerShell是一种命令行外壳程序和脚本环境,它内置在每个受支持的Windows版本中(Windows 7/Windows 2008 R2和更高版本),使命令行用户和脚本编写者可以利用.NET Framework的强大功能。一旦攻击者可以在一台计算机上运行代码,他们就会下载Powershell脚本文件(.ps1)到磁盘中执行,甚至无需...

使用阿里云服务器写shell脚本发送qq邮件的三个形式

【准备工作】 IPtables的使用如下命令:(执行以下以下命令把25和465端口打开) iptables -A INPUT -p tcp --dport 25 -j ACCEPT iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT iptables -A INPUT -p tcp --dport 465 -j...

vue可调整大小和可拖动的组件---vue-draggable-resizable

vue-draggable-resizable 用于可调整大小和可拖动元素的组件、并支持组件之间的冲突检测和组件对齐。 使用流程: 安装依赖: npm install --save vue-draggable-resizable 注册组件(在main.js中添加下列代码): import Vue from 'vue' import VueDraggabl...

xp 安装SATA AHCI驱动

2009-03-13 23:37经常有人问xp无软驱安装sata ahci驱动的问题,方法当然很多,最简单就是下一个集成好的iso, 或自己集成,非官方的有用nlite或自己修改TXTSETUP.SIF集成等。 我找了微软官方建议的方法,给大家参考。 微软的方法优点是不会改动系统文件,保持了系统的纯洁性。 [s:7] 弊端就是不一定支持光盘启动xp直接安装...

mysql relay log参数汇总

前言:MySQL进行主主复制或主从复制的时候会在home目录下面产生相应的relay log,本文档总结这些相关参数的定义及解释 1、什么是relay log The relay log, like the binary log, consists of a set of numbered files containing events that desc...