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记录进数据库还是很有必要的,因为当我们站点出现异常的时候,我们一般都会跳转到一个相对友好的页面,而不是让用户看到异常。
这样,在真实的站点中,我们通过数据库中记录的异常,就可以查到相应的信息了。