首先说说为何要进行日志记录。在一个完整的程序系统里面,日志系统是一个很是重要的功能组成部分。它能够记录下系统所产生的全部行为,并按照某种规范表达出来。咱们可使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。html
Log4net是一个很著名的开源的日志记录组件。官方网址为:http://logging.apache.org/log4net/ ,使用Log4net可以很简单的为咱们的程序添加日志记录功能。下面咱们先经过一个网站例子来讲明如何在.net中使用log4net。web
第一步,数据库
固然是添加log4net.dll的引用啦,我这里提供一个log4net的dll文件,懒得去官网下的能够到这里下http://www.vdisk.cn/down/index/7509396A7366apache
第二步,windows
在AssemblyInfo.cs文件中添加下面一句话:缓存
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]
这句话的意思是log4net会自动寻找配置文件App.config或Web.config从而得到并加载其中的配置信息。若是想log4net随时监视配置文件以便从新加载的话就要这样写按照上面同样写(winform程序ConfigFile为App.config)。网络
第三步,app
配置Web.config。asp.net
<configuration> <configSections> <!--注意:这里须要添加--> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <connectionStrings> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings> <!--注意:这里须要添加--> <log4net> <!--定义输出到文件中--> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <!--定义文件存放位置--> <file value="C:\log.txt" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd-HH:mm:ss" /> <layout type="log4net.Layout.PatternLayout"> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" /> </layout> </appender> <!--定义输出到控制台命令行中--> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定义输出到windows事件中--> <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb--> <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--定义各个参数--> <parameter> <parameterName value="@logDate" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date" /> </layout> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> <!--定义日志的输出媒介,下面定义日志以四种方式输出。也能够下面的按照一种类型或其余类型输出。--> <root> <!--文件形式记录日志--> <appender-ref ref="LogFileAppender" /> <!--控制台控制显示日志--> <appender-ref ref="ConsoleAppender" /> <!--Windows事件日志--> <!--<appender-ref ref="EventLogAppender" />--> <!-- 若是不启用相应的日志记录,能够经过这种方式注释掉 <appender-ref ref="AdoNetAppender_Access" /> --> </root> </log4net> <system.web> <compilation debug="true" targetFramework="4.0" /> <httpModules> <add name="fileUpload" type="WebApplication3.ProcessFileModule"/> </httpModules> <authentication mode="Forms"> <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> </authentication> <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> </providers> </roleManager> <httpRuntime maxRequestLength="10240000"/> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
上面这段配置取自周公,配置的说明上面已经注释的比较详细了。less
第四步,
在程序中记录信息。咱们在项目下Default.aspx的Page_Load方法加入以下代码:
//得到log4net实例 ILog log = log4net.LogManager.GetLogger("LogFileAppender"); log.Info("Default.aspx下面的PageLoad方法被执行");
而后运行项目,能够发如今c:\log4netfile.txt中已经记录了一条日志信息:
记录时间:2011-04-21 21:26:17,729 线程ID:[4] 日志级别:INFO 出错类:LogFileAppender property:[(null)] - 错误描述:Default.aspx下面的PageLoad方法被执行
经过上面这几步我想您已经可以为程序建立一些简单日志记录功能了。下面咱们再来详细说说log4net其余的一些使用方法与特色。
这里我经过问答的形式来讲明log4net的一些应用。
1.log4net总共有几种记录方式,每种方式该如何配置与使用?
Log4net目前支持的输出方式包括:
1 AdoNetAppender
将日志记录到数据库中。能够采用SQL和存储过程两种方式。
2 AnsiColorTerminalAppender
在ANSI 窗口终端写下高亮度的日志事件。
3 AspNetTraceAppender
能用asp.net中Trace的方式查看记录的日志。
4 BufferingForwardingAppender
在输出到子Appenders以前先缓存日志事件。
5 ConsoleAppender
将日志输出到控制台。
6 EventLogAppender
将日志写到Windows Event Log.
7 FileAppender
将日志写到文件中。
8 LocalSyslogAppender
将日志写到local syslog service (仅用于UNIX环境下).
9 MemoryAppender
将日志存到内存缓冲区。
10 NetSendAppender
将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
11 RemoteSyslogAppender
经过UDP网络协议将日志写到Remote syslog service。
12 RemotingAppender
经过.NET Remoting将日志写到远程接收端。
13 RollingFileAppender
将日志以回滚文件的形式写到文件中。
14 SmtpAppender
将日志写到邮件中。
15 TraceAppender
将日志写到.NET trace 系统。
16 UdpAppender
将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
|
能够看到目前支持的方式仍是不少的,我这里调几个认为经常使用的作个例子。
1.文件的方式咱们上面已经讲过了,这里再也不作例子了。
2.数据库方式:
首先,添加数据库记录appender
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> <!--数据库链接字符串--> <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--定义各个参数--> <parameter> <parameterName value="@logDate" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date" /> </layout> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender>
而后创建c:log4net.mdb 数据库,并在代码中启用数据库记录方式:
//得到log4net实例 ILog log = log4net.LogManager.GetLogger("AdoNetAppender_Access"); log.Debug("Default.aspx下面的PageLoad方法被执行");
这样日志就被记录到数据库中了。
2.log4net如何过滤我想要的日志信息,好比一个日志中只记录程序错误日志?
这个需求能够经过配置filter来实现。具体操做以下:
全局方式:
这种方式会将级别应用于全部的日志输入方式。具体操做为在root节点下添加:
<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF 好比定义级别为INFO,则INFO级别向下的级别,好比DEBUG日志将不会被记录 --> <!--若是没有定义LEVEL的值,则缺省为DEBUG--> <level value="ERROR" />
这样对于全部的日志记录方式,全部地域ERROR级别的都不会被记录了。
单独配置级别方式:
该方式不会影响其余的日志输入方式。方法以下为,在具体的appender下添加filter:
<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="Fatal" /> </filter>
这种方式能够配置记录级别的方位,若是只须要记录一种,则最大和最小设置同样就好了。
3.你上面的日志输出格式我不喜欢,如何在log4net中配置我想要的日志输出格式?
log4net的输入格式定义在每一个appender的layout中。具体的有如下内置可选项:
%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个字符则以空格填充。
经过这些东西,你能够任意组合你喜欢的输出格式内容。
4.有没有方式控制程序自动按日期记录日志信息,即天天的日志都在不一样的日志文件中?
其实这种方式对应于一种特定的记录方式:RollingFileAppender。这种方式也是基于文件记录的,不过他提供更加灵活的日志记录方式。具体说来他能够按日志文件的大小或者日志记录的时间进行自动变换日志文件。
按天天不一样的日期进行记录分类:
<appender name="RollingLogFileAppenderEveryMin" type="log4net.Appender.RollingFileAppender"> <!--日志文件名开头--> <file value="c:\logfile.txt" /> <!--是否追加到文件--> <appendToFile value="true" /> <!--变换的形式为日期--> <rollingStyle value="Date" /> <!--日期的格式,每分钟换一个文件记录--> <datePattern value="yyyyMMdd-HHmm" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
按照日志文件的大小进行变换,经过这种方式能够有效下降日志文件体积膨胀的问题:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日志文件名--> <file value="c:\log.txt"/> <!--是否在文件中追加--> <appendToFile value="true"/> <!--按照文件的大小进行变换日志文件--> <rollingStyle value="Size"/> <!--最大变换数量,若是超过这个数量则从第一个文件开始复写--> <maxSizeRollBackups value="10"/> <!--最大文件大小,支持KB,MB,GB--> <maximumFileSize value="100KB"/> <!--日志文件名是否为静态--> <staticLogFileName value="true"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> </layout> </appender>
最后从网上找了一段写日志的原则,感受仍是很好的:
【写日志的原则】
Ⅰ.在catch后,把异常写入日志.
Ⅱ.在调用第三方控件的开始和结束处.
Ⅲ.在链接数据库的开始结束处.
Ⅳ.除非必要,不要在循环体中加入日志,不然一旦出问题可能致使日志暴增.
Ⅴ.在本身认为很重要的逻辑处写入日志.