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

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

  • 相关阅读:
    E百科 | 第2期 扒一扒能加速互联网的QUIC协议
    阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
    阿里巴巴开源容器镜像加速技术
    Fluid — 云原生环境下的高效“数据物流系统”
    一站式云原生智能告警运维平台——SLS新版告警发布!
    重磅官宣:Nacos2.0 发布,性能提升 10 倍
    阿里云高级技术专家周哲:阿里云边缘云原生应用实践
    互联网泛娱乐直播安全的解决之道
    货运物流移动端解决方案:为货运物流行业打造高性能、高粘性的“双端”触点
    SpringMVC(十四) RequestMapping ModelAndView
  • 原文地址:https://www.cnblogs.com/tian2010/p/2402294.html
Copyright © 2020-2023  润新知