Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。
最近正在做一个大型网站,网站已经基本成型,到了后期维护和修改的阶段,经常会遇到某些页面打不开的状态,出现了未知的错误,回头想想,还是日志做的不详细,跟踪的不彻底,在网上搜了搜,找到了一个不错的关于.net 日志记录组件的文章,也是博客园的用户,也转载下,好好学习学习,然后应用到我的网站上。
一Log4net简介
Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。
Log4net可以从http://logging.apache.org/log4net/downloads.html网站下载最新版本。
二 Log4net核心组成
Log4net主要由五个部分组成,分别为Logger,Appenders,Filters, Layouts 和Object Renders。
一) Logger(日志)
1. 记录日志的分类:
Log4net能够以多种方式输出日志。支持的日志输出常用的主要媒介有数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制台,文件,事件日志(可以用事件查看器查看)和邮件等多种方式。
2. 日志的级别
Log4net支持多种级别的日志。优先级从高到低依次排列如下:
FATAL > ERROR> WARN > INFO > DEBUG
此外还有ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求)这两种特殊的级别。
二) Appenders
Appenders决定日志输出的方式。
Appenders必须实现log4net.Appenders.IAppender接口。
Log4net目前支持的输出方式包括:
1 AdoNetAppender
将日志记录到数据库中。可以采用SQL和存储过程两种方式。
2AnsiColorTerminalAppender
在ANSI 窗口终端写下高亮度的日志事件。
3AspNetTraceAppender
能用asp.net中Trace的方式查看记录的日志。
4BufferingForwardingAppender
在输出到子Appenders之前先缓存日志事件。
5 ConsoleAppender
将日志输出到控制台。
6 EventLogAppender
将日志写到Windows EventLog.
7 FileAppender
将日志写到文件中。
8LocalSyslogAppender
将日志写到local syslogservice (仅用于UNIX环境下).
9 MemoryAppender
将日志存到内存缓冲区。
10 NetSendAppender
将日志输出到WindowsMessenger service.这些日志信息将在用户终端的对话框中显示。
11RemoteSyslogAppender
通过UDP网络协议将日志写到Remotesyslog service。
12 RemotingAppender
通过.NET Remoting将日志写到远程接收端。
13RollingFileAppender
将日志以回滚文件的形式写到文件中。
14 SmtpAppender
将日志写到邮件中。
15 TraceAppender
将日志写到.NET trace 系统。
16 UdpAppender
将日志connectionlessUDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
三) Filters
Appender对象将日志以缺省的方式传到输出流,然后Filter可以按照不同的标准控制日志的输出。Filter可以再配置文件中配置。最简单的形式是在appender中写明一个Threshold.这样只有级别大于或等于此Threshold的日志才被记录。
Filters必须实现log4net.Filters.IFilter接口。
四) Layouts
Layouts控制日志显示的格式样式。日志的显示格式如下:
"%timestamp[%thread] %-5level %logger - %message%newline"
Timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。
Thread:执行当前代码的线程。
Level:日志的级别。
Logger:日志相关请求的名称。
Message: 日志消息。
Layouts还可以控制日志的输出样式,比如以普通形式或以xml等形式输出。
五) ObjectRenderers
这是很重要的一项,log4net将按照用户定义的标准输出日志消息。
Object Renders必须实现log4net.ObjectRenderer.IObjectRenerer接口。
三 如何在项目中使用log4net
下面有个基于控制台的demo,举例描述了log4net怎么用于输出日志。
本例中,日志将会记录到文件,控制台,事件日至和Access数据库中。
一)主要代码:
1. 配置文件app.config
Code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
<appSettings>
<!-- To enable internal log4net logging specify the followingappSettings key -->
<!-- <add key="log4net.Internal.Debug"value="true"/> -->
</appSettings>
<!-- This section contains the log4net configuration settings -->
<log4net>
<!--定义输出到文件中-->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="D:log-file1.txt" />
<!-- Example using environment variables in params -->
<!-- <file value="${TMP}log-file.txt" /> -->
<!--<sppendToFile value="true" />-->
<!-- An alternate output encoding can be specified -->
<!-- <encoding value="unicodeFFFE" /> -->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="[Footer]--Test By Ring1981 " />
<!--输出格式-->
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %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数据库中,数据库为D盘的access.mdb-->
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
<connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:access.mdb" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message])VALUES (@log_date, @thread, @log_level, @logger, @message)" />
<!--定义各个参数-->
<parameter>
<parameterName value="@log_date" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date" />
</layout>
</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="1024" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
<!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
<root>
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="EventLogAppender" />
<appender-ref ref="AdoNetAppender_Access"/>
</root>
</log4net>
</configuration>
2.LoggingExample.cs
Code
//Configurelog4netusingthe.configfile
[assembly:log4net.Config.XmlConfigurator(Watch=true)]
//Thiswillcauselog4nettolookforaconfigurationfile
//calledConsoleApp.exe.configintheapplicationbase
//directory(i.e.thedirectorycontainingConsoleApp.exe)
namespaceConsoleApp
{
usingSystem;
/**////<summary>
///Exampleofhowtosimplyconfigureanduselog4net
///</summary>
publicclassLoggingExample
{
privatestaticreadonlylog4net.ILoglog=log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
publicstaticvoidMain(string[]args)
{
log.Error("ErrorAcc");
log.Fatal("FatleAcc");
System.Console.ReadLine();
}
}
}
运行程序,日志就会以xml中定义的四种媒介形式输出。
来自:http://tech.ddvip.com/2008-11/122705683693357_3.html