(3)log4net之AdoNetAppender
AdoNetAppender主要用于将log存储在数据库中,既然是存储到数据库中,就需要创建一张表来存储log。
这里以SQL SERVER为例:
CREATE TABLE [dbo].[Log] ( [Id] [int] IDENTITY (1, 1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [varchar] (255) NOT NULL, [Level] [varchar] (50) NOT NULL, [Logger] [varchar] (255) NOT NULL, [Message] [varchar] (4000) NOT NULL, [Exception] [varchar] (2000) NULL )
接下来我们按照log三部曲来介绍
1)配置文件
AdoNetAppender的配置文件比较复杂
<?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="100" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="data source=TIAN-PC\TIANINSTANCE;initial catalog=ValveSystem;UID=sa;PWD=tian2012"/> <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <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> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender> <root> <level value="INFO"/> <appender-ref ref="GlobalFile"/> </root> <logger name="AdoNet"> <level value="DEBUG"/> <appender-ref ref="AdoNetAppender"/> </logger> <logger name="Global" additivity="false"> <level value="DEBUG"/> <appender-ref ref="GlobalFile"/> </logger> </log4net>
其中connectionType和connectionString主要是配置数据库连接,commandText是执行插入数据的脚本。
parameter节点主要是配置各个参数用于记录到表中的相应字段。
其余的root和logger跟上一篇介绍的差不多。
配置完文件之后,我们就可以在代码中调用logger进行写入log了。
为了代码介绍方便,我们将获取获取log和写入log放到一起:
protected void Page_Load(object sender, EventArgs e) { log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/log4net.xml"))); ILog logger = LogManager.GetLogger("AdoNet"); try { int zero = 0; int a = 2 / zero; } catch (Exception exception) { logger.Error(exception.Message,exception); throw; } }
这里只是一个例子,我们为了捕捉异常,因此特意做了一个除零错误。
让我们看看数据库返回的数据是如何的:
Id Date Thread Level Logger Message Exception
5 2012-03-16 22:35:30.220 15 ERROR AdoNet 试图除以零。 System.DivideByZeroException: 试图除以零。 在 StoneAccessory.Index.Page_Load(Object sender, EventArgs e) 位置 E:\Tian\ThornBird\StoneAccessory\Index.aspx.cs:行号 23
可以发现,数据库根据我们定义的参数,将异常信息都记录下来了。
将Exception记录进数据库还是很有必要的,因为当我们站点出现异常的时候,我们一般都会跳转到一个相对友好的页面,而不是让用户看到异常。
这样,在真实的站点中,我们通过数据库中记录的异常,就可以查到相应的信息了。