Log4Net ,.net和SQL Server的完美结合

不过,我在我这个项目中,具体使用的方法有点不同。

这个学生处学生信息管理系统,业务日志比较简单,其实并不需要使用log4net。所以在这个项目中,只用log4net来记录错误日志。

1.建立配置文件。以下配置,是把信息记录到数据库和一个以当前日期为名字的日志txt文件。从数据库的insert语句就可以看出数据库的

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    </configSections>
  <log4net>
    <appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="server=codebase;database=StuDepartmentOA;uid=sadis;pwd=123;timeout=300;" />
      <commandText value="INSERT INTO ErrLog ([Time],[errLevel],[Info],[Exception]) VALUES (@time, @level, @info, @exception)" />
      <parameter>
        <parameterName value="@time" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@level" />
        <dbType value="String" />
        <size value="8" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@info" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="1000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%exception" />
        </layout>
      </parameter>
    </appender>
    <appender name="FileErrLogAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志文件的存储路径-->
      <file value="bin\Log\"/>
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyy-MM-dd.LOG"/>
      <!--根据日期,定义文件名-->
      <staticLogFileName value="false"/>
      <!--日志文件输出格式-->
      <layout  type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]"/>
        <param name="Footer" value="[Footer]"/>
        <ConversionPattern value="%nTime: %d %n Level: %level   Info: %message %nException: %exception"/>
      </layout>
    </appender>
    <!-- Setup the root category, add the appenders and set the default level -->
    <root>
      <level value="WARN"/>
      <level value="INFO"/>
      <level value="DEBUG"/>
    </root>
    <!-- Specify the level for some specific categories -->
    <logger name="logger">
      <level value="WARN"/>
      <level value="INFO"/>
      <level value="DEBUG"/>
      <appender-ref ref="FileErrLogAppender"/>  
      <appender-ref ref="ADONetAppender" />
    </logger>
  </log4net>
</configuration>

对应的数据库表:

USE [StuDepartmentOA]
GO
/****** 对象:  Table [dbo].[ErrLog]    脚本日期: 08/16/2009 10:09:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ErrLog](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [time] [datetime] NOT NULL,
    [errLevel] [varchar](8) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [info] [nvarchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [exception] [varchar](1000) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_errLog] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF

2.把配置文件放到Web目录下,跟web.config同一层。

3.建立globe.asax文件,在Application_Start中加入

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~") + @"\log4net.config"));

4.再加入相应的引用。然后如果项目中有其他类库,那么再在对应用到的类库中加入引用。

(!!这里需要注意的是,如果用了NHibernate,就需要注意了,必须加入对应版本的log4net,不然会出错。我本来加了一个1.2.9的log4net,但NHibernate默认用附带的1.2.10,运行时就报错了)

5.实际使用:

using System;
using log4net;
namespace DAL
{
    /// <summary>
    /// LogHelper 的摘要说明
    /// </summary>
    public class LogHelper
    {
        private static ILog Logger = log4net.LogManager.GetLogger("logger");
        public static void Debug(string message, Exception ex)
        {
            if(Logger.IsDebugEnabled)
            {
                Logger.Debug(message, ex);
            }
        }
        public static void Debug(string message)
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.Debug(message);
            }
        }
        public static void Info(string message, Exception ex)
        {
            if(Logger.IsInfoEnabled)
            {
                Logger.Info(message, ex);
            }
        }
        public static void Info(string message)
        {
            if (Logger.IsInfoEnabled)
            {
                Logger.Info(message);
            }
        }
        public static void Error(string message, Exception ex)
        {
            if (Logger.IsErrorEnabled)
            {
                Logger.Error(message,ex);
            }
        }
        public static void Error(string message)
        {
            if (Logger.IsErrorEnabled)
            {
                Logger.Error(message);
            }
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Oracle 联机重做日志文件(ONLINE LOG FILE)

--=========================================

13020
来自专栏乐沙弥的世界

Linux 5 下安装MySQL 5.6(RPM方式)

    MySQL在很多领域被广泛使用,尤其是很多互联网企业,诸如腾讯,阿里等等。本文主要介绍在Linux 5下通过rpm方式来安装Mysql,这是比较简单的一...

15310
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(31)-MVC使用RDL报表

这次我们来演示MVC3怎么显示RDL报表,坑爹的微软把MVC升级到5都木有良好的支持报表,让MVC在某些领域趋于短板 我们只能通过一些方式来使用rdl报表。 R...

39450
来自专栏乐沙弥的世界

使用带dblink方式的datapump迁移Oracle 10g到11g

      对于从Oracle 10g下迁移数据库到Oracle 11g,除了使用RMAN方式之外,我们可以使用带dblink的datapump方式来实现基于逻...

8510
来自专栏杨建荣的学习笔记

impdp异常中断导致的问题(r2第8天)

今天查看数据库的负载,发现cpu消耗异常的高。里面有不少dw的进程.但是查看impdp的进程却不存在。 查看datapump的进程情况,发现大量的job,但是状...

401110
来自专栏杨建荣的学习笔记

一条sql语句“导致”的数据库宕机问题及分析 (38天)

最近测试环境需要做一些变更,把测试环境切分成两套环境,存储空间也需要压缩压缩和整理。 unix组的人已经开始做空间划分了,然后我们需要在此基础上重建一套环境。 ...

36740
来自专栏乐沙弥的世界

PL/SQL-->UTL_FILE包的使用介绍

    在PL/SQL中,UTL_FILE包提供了文本文件输入和输出互功能。也就是说我们可以通过该包实现从操作系统级别来实现文件读取输入或者是写入到操作系统文件...

11010
来自专栏码农分享

SQL Server 多表数据增量获取和发布 2.2

数据库环境: 1、SQLServer 2008R2 2、SQLServer 代理打开

8810
来自专栏Jerry的SAP技术分享

ABAP OPEN SQL里OPEN CURSOR和SELECT的比较

After the OPEN CURSOR statement, the database cursor is positioned in front of t...

39390
来自专栏杨建荣的学习笔记

关于dual表的破坏性测试(r3笔记第60天)

关于dual表的破坏性测试,既然是破坏性测试,就需要确定这个测试仅限于测试或者个人学习所用,可能有些sql看似极为简单,但是一旦运行就会导致整个业务系统崩溃。 ...

409130

扫码关注云+社区

领取腾讯云代金券