使用log4net 来记录系统日志

29 篇文章 0 订阅
Log4net 记录日志并写入到数据库
具体步骤如下:

1.下载log4net的Dll文件并引入到项目中,在主项目添加对log4net.dll的引用

2.在相应的Globall.cs文件中的Application_Start 事件中写入

protected   void  Application_Start(Object sender, EventArgs e)  
        { 
            log4net.Config.XmlConfigurator.Configure(
                 new System.IO.FileInfo( "log4net.config" )); 
        } 


 说明:其中的 log4net.config 就是日志记录专用的配置文件 ,通常情况下,对log4net 的配置在一个专用的配置文件中,这样可以方便修改与维护

3.在项目对应的 AsserblyInfro.cs文件中要添加以下代码:

[assembly: log4net.Config.XmlConfigurator(ConfigFile  =   "log4net.config" , Watch =  true )]  

 说明: 表示要注册在程序集信息文件中, 受应用程序的保护, Watch=true  表示始终监视应用程序的运行情况,如果设置为false log4net 就不会监视应用程序的运行情况 ,自然也就不会记录日志了

4.在项目的主根目录下添加一个 web配置文件,与web.config同路径,之所以不写入web,config文件, 是因为这样可以单独修改调试部署,也就是非侵入式安装的思想。并将文件的名称改为 log4net.config 对应于上面前两步骤提到的 log4net.config 文件名

5 在<configuration>节点中写配置信息添加

<configSections>  
        <section name="log4net"                                                        
  type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />  
    </configSections>  


 

6. 在 <log4net> 节点中写配置,主要的配置就是在这个节点下

<appender> 节点中定义日志的存储目标,可以是文体文档,可以是数据库,也可以是邮箱中


注意:
    Logger的名称区分大小写并遵循以下规则:

1、如果A logger的名称如果是B logger名称的前缀(通过“.”连接),则说  A
       logger是B logger的祖父级。

2、如果A logger的名称和B logger的名称之间不存在其他的logger名称,则      
       A logger是B logger的父级。
      例如:A logger名称为“Foo.Bar”,B logger名称为“Foo.Bar.Baz”, A为B的父级。名称为“System”的logger是名称为“System.Text.StringBuilder”的祖父级。
3. Root logger位于logger层次级别中的顶级。
  它有例外的三条规则:
1、Root logger总是存在的。
2、Root logger不能通过名称或取。
3、Root logger 有一个默认的Level 值为 Debug。

Logger 可以通过log4net.LogManager类的静态方法GetLogger获取。
 
Level值有: ALL/DEBUG/INFO/WARN/ERROR/FATAL/OFF
   它们的优先级是:  DEBUG <INFO<WARN<ERROR<FATAL

Level 继承规则:如果一个logger没有定义Level,它的Level值将从它的父级(定义了Level)继承。

日志纪录请求通过调用logger实例的输出方法实现。
这些输出方法有Debug,Info,Warn,Error和Fatal。
通过定义,输出方法决定了日志纪录请求的Level。
例如,log是一个logger实例,那么语句log.Info(“..”)的日志纪录请求Level为INFO。 如果日志纪录请求的Level比logger本身定义(或继承)的Level高,则请求是可行的,否则不可行。

 

总结:以下是 log4net 在log4net.config 文件中的具体配置,错误或异常日志要在catch 块中进行捕获。

 

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <!--Log4net Begin by Tony  2008.11.20-->
  <log4net>
    <!-- 义日志的存储目标,可以是文体文档,可以是数据库,也可以是邮箱中, 这里存储在数据库中-->
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <!-- 存入DB 前 缓存的数量, 1代表立即存入,这样可以避免频繁的与数据库进行交互-->
      <bufferSize value="10" />
      <!-- 这时定义数据库连接的类型-->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <!--数据库连接字符串-->
      <connectionString value="Data Source=.\sqlexpress;Initial Catalog=fengji;User ID=sa;Password=1;" />
      
      <!-- 将日志写入数据库中的 sql 命令语句-->
      <commandText value="INSERT INTO cms_logger ([log_date],[thread],[log_level],[logger],[lmessage],[lexception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <!-- parameter 是定义参数的节点, 就是参数化sql命令语句,和sql 参数化命令相同,注意这里参数类型要与数据库表中字段的类型,长度,个数一致否则可能写不到数据库中 -->
      <parameter>
        <parameterName value="@log_date" />  <!-- 定义参数的名称 -->
        <dbType value="DateTime" />  <!-- 参数的类型-->
        <layout type="log4net.Layout.RawTimeStampLayout" /> <!-- 控制Appender的输出格式,可以是线性的也可以是XML。-->
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%t" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="500" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>
    <!-- 设定优先级,选择 log目标  Logger 可以通过log4net.LogManager类的静态方法GetLogger获取。  Level值有:ALL/DEBUG/INFO/WARN/ERROR/FATAL/OFF 
     它们的级别关系是 : DEBUG <INFO<WARN<ERROR<FATAL
    -->
    <root>
      <level value="ERROR"/>
      <level value="WARN"/>
      <level value="INFO"/>
      <level value="DEBUG"/>
      <level value="FINE"/>
      <appender-ref ref="ADONetAppender" />
    </root>
    <!--  对特殊的目录,设置特殊的优先级 -->
    <logger name="iNotes">
      <level value="WARN"/>
      <level value="INFO"/>
      <level value="DEBUG"/>
      <level value="FINE"/>
      <appender-ref ref="ADONetAppender"/>
    </logger>
    <logger name="StellaLogger">
      <level value="ALL"/>
      <appender-ref ref="AdoNetAppender" />
    </logger>
  </log4net>
  <!--Log4net End-->
</configuration>


对就的后台代码:

        // 初始化 log4net 日志记录器
        private static log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


        public ActionResult Index()
        {

           
            myLogger.Info(DateTime.Now.ToString() + ": loging successs" );
            //  调试消息
            myLogger.Debug("这是hansong的LOG DEBUG测试!");
            // 错误消息
            myLogger.Error("发生错误,系统已经记录到,请联系管理员!");

            return View();
        }


 具体的参数可以参考:
    http://blog.sina.com.cn/s/blog_6d1c583c01010tf3.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值