zoukankan      html  css  js  c++  java
  • Log4Net的应用教程之保存日志到数据库中

         关于Log4Net的应用,网上有很多教程,但大多数都是拷贝复制,有些按照他的代码来,运行起来发现也出不来效果,但是Log4net的作用实在是非常大的,或者这里说的不对,应该说系统的日志功能是很重要的也很有必要的,当然设置系统的时候完全可以自己来开发一个日志功能,不外乎就是写日志到文件或者数据库中等等,如果写日志到数据库中,那么就需要使用ADO了,如果是三层架构的,那么这个日志添加就不能再任何地方都可以随便添加了,但是Log4net可以做到独立的链接数据库,并且在系统的任何地方都能够使用。

        01 我们先添加一个简单的asp.net web项目
        我们再添加一个common的类库,这个类库是一些公共的工具类
        在添加一个Business的类库,这个类库主要是业务逻辑层的,我这里主要是为了测试在系统任何地方都能调用数据库,所以才创建这些类库
        创建后的项目如下:
          
      02 引入log4net.dll的引用,可以在下方的源码中找到,我们在common中引入这个dll
     
      03  我们创建一个数据库,这里面你可以使用你已经创建好的数据库,我这里创建一个名Log4NetDB的数据库
            添加,一张数据表Log,sql代码如下
            
    if exists (select 1
    from sysobjects
    where id = object_id('Log')
    and type = 'U')
    drop table Log
    go
     
    /*==============================================================*/
    /* Table: Log */
    /*==============================================================*/
    create table Log (
    Id bigint identity,
    AddTime datetime not null,
    Thread nvarchar(100) not null,
    Level nvarchar(200) not null,
    Logger nvarchar(500) not null,
    Message nvarchar(3000) not null,
    Exception nvarchar(4000) null,
    constraint PK_LOG primary key (Id)
    )
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    'Log4net日志表',
    'user', @CurrentUser, 'table', 'Log'
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    '日志主键',
    'user', @CurrentUser, 'table', 'Log', 'column', 'Id'
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    '添加时间',
    'user', @CurrentUser, 'table', 'Log', 'column', 'AddTime'
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    '所在线程',
    'user', @CurrentUser, 'table', 'Log', 'column', 'Thread'
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    '级别',
    'user', @CurrentUser, 'table', 'Log', 'column', 'Level'
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    '拥有者',
    'user', @CurrentUser, 'table', 'Log', 'column', 'Logger'
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    '日志信息',
    'user', @CurrentUser, 'table', 'Log', 'column', 'Message'
    go
     
    declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description',
    '异常信息',
    'user', @CurrentUser, 'table', 'Log', 'column', 'Exception'
    go
     
     04 在log4netdemo主项目根目录添加一个Log4net.config的配置文件
     
     
    <?xml version="1.0"?>
    <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.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <!--数据库连接字符串-->
    <connectionString value="DATABASE=Log4NetDB;SERVER=.;UID=sa;PWD=pwdpwd;Connect Timeout=15;" />
    <commandText value="INSERT INTO Log ([AddTime],[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="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="3000" />
    <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>
    <root>
    <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>
    </configuration>
    05 在主项目中的AssemblyInfo.cs 添加
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 
     
    06 使用的时候,需要先实例化日志对象
        比如在page里面
        
     private static log4net.ILog logHelper = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    protected void Page_Load(object sender, EventArgs e)
    {
    //项目中调用使用日志
    logHelper.Info("hehe");
    }
       在common里面
       
    private static log4net.ILog logHelper = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
     
    public static void ComHelperDo()
    {
    int i = 0;
    try
    {
    int b = 3 / i;
    }
    catch (Exception ex)
    {
    logHelper.Error("发现异常", ex);
    }
    }
     在business里
     
     private static log4net.ILog logHelper = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    public static void BusHelperDo()
    {
    logHelper.Error("错误信息");
    }
    最后数据库里就添加成功了
     
    需要用到日志的项目就需要引入log4net的dll
    用起来也挺方便的
    感谢你的阅读,希望对你有帮助,欢迎关注作者的个人主页 www.bamn.cn 希望博客园允许打一点点广告....
     
  • 相关阅读:
    P2824 [HEOI2016/TJOI2016]排序
    P4930「FJ2014集训」采药人的路径
    FlexboxLayout 的一些基本介绍与基本用法
    Android——打造万能适配器(CommonAdapter)
    关于list、set、map的几点总结
    equals()和hashCode()区别?
    Android开发艺术探索(一)——Activity的生命周期和启动模式
    Android开发艺术探索(三)——View的事件体系
    Android五大布局重新回顾
    Android基础知识回顾
  • 原文地址:https://www.cnblogs.com/maijin/p/4618435.html
Copyright © 2011-2022 走看看