(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记录进数据库还是很有必要的,因为当我们站点出现异常的时候,我们一般都会跳转到一个相对友好的页面,而不是让用户看到异常。

这样,在真实的站点中,我们通过数据库中记录的异常,就可以查到相应的信息了。

posted @ 2012-03-16 22:56  Xiao Tian  阅读(1391)  评论(1编辑  收藏  举报