使用log4net记录日志到数据库(含有自定义属性)

记录日志是管理系统中对用户行为的一种监控与审核,asp.net中记录日志的方式有很多种,这里我只介绍一下最近用到的log4net,关于他的具体介绍网上有很多,我讲一下他的用法。

第一步:在配置文件中的<configSections>节添加下面一句话

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

第二步:在<configuration>节中添加如下内容

< log4net>
  <root >
   <level value="Debug"/>
   <appender-ref ref="ADONetAppender"/>
  </root>
  <logger name="myLogger">
      <level value="Debug"/>
      <appender-ref ref="ADONetAppender"/>
    </logger>

//关于上边root到logger这块,如果同时出现,有可能会出现重复插入记录的情况,那么就需要改一下代码,把上面两段代码改成如下一段代码,如下:

<root >
   <level value="Debug" name="myLogger"/>
   <appender-ref ref="ADONetAppender"/>
  </root>

//下面就是对插入到数据库一些基本设置和基本字段设置
  <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender,log4net">
   <!--BufferSize为缓冲区大小,只有日志记录超10条才会一块写入到数据库-->
   <bufferSize value="10"/>
   <!--或写为<param name="BufferSize" value="10" />-->
   <!--引用-->
   <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
   <!--连接数据库字符串-->
   <connectionString value="Data Source=.;Initial Catalog=audit;Persist Security Info=True;User ID=sa;Password=123;MultipleActiveResultSets=True"/>
   <!--插入到表Log-->

<commandText value="INSERT INTO T_AUDITINFO ([EVENTTYPE],[TIMESTAMP],[EVENTCATEGORY],[EVENT_ID],[COMPUTERNAME],[MAC_ADDRESS],[USERNAME],[SOURCETYPE],[SOURCE],[DESCRIPTION],[COLLECTDATE]) VALUES (@Event_Type,@log_date, @EventCategory, @Event_ID, @ComputerName,@Mac_Address,@UserName,@SourceType,@Source,@Description,@CollectDate)"/>
   <!--日志类型,这里均为3-->
   <parameter>
    <parameterName value="@Event_Type"/>
    <dbType value="Int32"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{Event_Type}"/>//注意这里,当用到property时,就表明这是用户自定义的字段属性啦,是log4net中所没有提供的字段。其中MyLayout是自定义属性所在的类,
LogComponent是类所在的命名空间,这是我们自己要写的部分,将在下面介绍。

</layout>
   </parameter>
   <!--日志记录时间,RawTimeStampLayout为默认的时间输出格式 -->
   <parameter>
    <parameterName value="@log_date"/>
    <dbType value="DateTime"/>
    <layout type="log4net.Layout.RawTimeStampLayout"/>//这里呢是获取log4net中提供的日志时间
   </parameter>
   <!--日志分类描述-->
   <parameter>
    <parameterName value="@EventCategory"/>
    <dbType value="String"/>
    <size value="50"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{EventCategory}"/>
    </layout>
   </parameter>
   <!--日志分类号-->
   <parameter>
    <parameterName value="@Event_ID"/>
    <dbType value="Int32"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{Event_ID}"/>
    </layout>
   </parameter>
   <!--计算机IP-->
   <parameter>
    <parameterName value="@ComputerName"/>
    <dbType value="String"/>
    <size value="50"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{ComputerName}"/>
    </layout>
   </parameter>
   <!--计算机Mac信息-->
   <parameter>
    <parameterName value="@Mac_Address"/>
    <dbType value="String"/>
    <size value="50"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{Mac_Address}"/>
    </layout>
   </parameter>
   <!--登陆系统用户名-->
   <parameter>
    <parameterName value="@UserName"/>
    <dbType value="String"/>
    <size value="50"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{UserName}"/>
    </layout>
   </parameter>
   <!--事件来源类型,这里默认为Rier-->
   <parameter>
    <parameterName value="@SourceType"/>
    <dbType value="String"/>
    <size value="20"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{SourceType}"/>
    </layout>
   </parameter>
  <!--事件来源-->
   <parameter>
    <parameterName value="@Source"/>
    <dbType value="String"/>
    <size value="50"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{Source}"/>
    </layout>
   </parameter>
   <!--事件描述-->
   <parameter>
    <parameterName value="@Description"/>
    <dbType value="String"/>
    <size value="500"/>
    <layout type="LogComponent.MyLayout, LogComponent">
     <param name="ConversionPattern" value="%property{Description}"/>
    </layout>
   </parameter>
   <!--日志收集时间-->
          
   <parameter>
    <parameterName value="@CollectDate"/>
    <dbType value="DateTime"/>
    <layout type="log4net.Layout.RawTimeStampLayout"/>
   </parameter>
        </appender>
      </log4net>

//博客出处有人引用后无法写入日志,于是可以将配置修改如下


1

2

3

4

5

6

7

<parameter>

 <parameterName value="@Event_Type"/>

 <dbType value="Int32"/>

 <layout type="LogComponent.MyLayout, LogComponent">//这里修改

  <param name="ConversionPattern" value="%property{Event_Type}"/>

 </layout>

</parameter>

改为


1

2

3

4

5

6

7

<parameter>

 <parameterName value="@Event_Type"/>

 <dbType value="Int32"/>

 <layout type="LogComponent.MyLayout">

  <param name="ConversionPattern" value="%property{Event_Type}"/>

 </layout>

</parameter>

第三步:自定义类,这些类呢包含将要插入数据库中的自定义字段

命名空间为 LogComponent 包含3个类:LogContent.cs、 MyLayout.cs 、MyMessagePatternConverter .cs

第一个类 LogContent.cs 包含了所有的自定字段属性

using System;
using System.Data;
using System.Configuration;
using System.Web;

/// <summary>
/// LogContent 的摘要说明
/// </summary>
public class LogContent
{
    public LogContent(int eventType,string eventCategory,int eventID,string computerName,string macAddress,string userName,string sourceType,string source,string description)
    {
        _event_Type = eventType;
        _eventCategory = eventCategory;
        _event_ID = eventID;
        _computerName = computerName;
        _mac_Address = macAddress;
        _userName = userName;
        _sourceType = sourceType;
        _source = source;
        _description = description;
    }

int _event_Type;
    /// <summary>
    /// 时间类型 均为3
    /// </summary>
    public int Event_Type
    {
        get { return _event_Type; }
        set { _event_Type = value; }
    }
    string _eventCategory;
    /// <summary>
    /// 日志分类描述,自定义
    /// </summary>
    public string EventCategory
    {
        get { return _eventCategory; }
        set { _eventCategory = value; }
    }
    int _event_ID;
    /// <summary>
    /// 日志分类号
    /// </summary>
    public int Event_ID
    {
        get { return _event_ID; }
        set { _event_ID = value; }
    }
    string _computerName;
    /// <summary>
    /// 计算机IP
    /// </summary>
    public string ComputerName
    {
        get { return _computerName; }
        set { _computerName = value; }
    }
    string _mac_Address;
    /// <summary>
    /// 计算机Mac地址
    /// </summary>
    public string Mac_Address
    {
        get { return _mac_Address; }
        set { _mac_Address = value; }
    }
    string _userName;
    /// <summary>
    /// 系统登陆用户
    /// </summary>
    public string UserName
    {
        get { return _userName; }
        set { _userName = value; }
    }
    string _sourceType;
    /// <summary>
    /// Rier
    /// </summary>
    public string SourceType
    {
        get { return _sourceType; }
        set { _sourceType = value; }
    }
    string _source;
    /// <summary>
    /// Rier Recorder audit
    /// </summary>
    public string Source
    {
        get { return _source; }
        set { _source = value; }
    }
    string _description;
    /// <summary>
    /// 日志描述信息
    /// </summary>
    public string Description
    {
        get { return _description; }
        set { _description = value; }
    }

}

第二个类  MyLayout.cs 把我们定义的属性转换为log4net所能识别的属性

using System;
using System.Collections.Generic;
using System.Text;
using log4net.Layout.Pattern;
using log4net.Layout;
using log4net.Core;
using System.Reflection;

namespace LogComponent
{
    class MyLayout:PatternLayout
    {
        public MyLayout()
        {
            this.AddConverter("property", typeof(MyMessagePatternConverter));
        }
    }
}

第三个类
using System;
using System.Collections.Generic;
using System.Text;
using log4net.Layout.Pattern;
using log4net.Layout;
using log4net.Core;
using System.Reflection;
namespace LogComponent
{
    class MyMessagePatternConverter:PatternLayoutConverter
    {
        protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                // Write the value for the specified key
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                // Write all the key value pairs
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            }
            //if (Option != null)
            //{
            //    // Write the value for the specified key
            //    WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty(Option));
            //}
            //else
            //{
            //    // Write all the key value pairs
            //    WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            //}
        }

/// <summary>
        /// 通过反射获取传入的日志对象的某个属性的值
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
        {
            object propertyValue = string.Empty;

PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
            if (propertyInfo != null)
                propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);

return propertyValue;
        }

}
}

代码页
记得在该项目中添加log4net引用

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using LogComponent;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

public partial class Test : System.Web.UI.Page
{
    
    protected void Page_Load(object sender, EventArgs e)
    {

}
    protected void Button1_Click(object sender, EventArgs e)
    {
        log4net.ILog log = log4net.LogManager.GetLogger("myLogger");

log.Info(new LogContent(3,"登陆系统",1,"127.0.0.1","111111","mhy","11111","11111111","登陆成功"));

}
}

时间: 2024-10-05 04:26:00

使用log4net记录日志到数据库(含有自定义属性)的相关文章

asp.net mvc中用 log4net记录日志到数据库中

1.log4net官网配置相关,创建数据库 http://logging.apache.org/log4net/release/config-examples.html CREATE TABLE [dbo].[tbl_LogInfo]( [ID] [int] IDENTITY(1,1) NOT NULL, [LogTime] [datetime] NOT NULL, [Thread] [nvarchar](max) NOT NULL, [LogLevel] [nvarchar](max) NUL

如何配置Log4Net使用Oracle数据库记录日志

最近在做一个项目的时候,需要增加一个日志的功能,需要使用Log4Net记录日志,把数据插入到Oracle数据库,经过好久的研究终于成功了.把方法记录下来,以备以后查询. 直接写实现方法,分两步完成: 1.使用NuGet Manager管理工具,增加对Oracle.ManagedDataAccess.dll的引用. 2.配置具体的文件. <?xml version="1.0"?><configuration>  <configSections>   

Log4Net(三)之记录日志到数据库

前面两篇短文向大家介绍了如何使用log4net,以及如何将log4net记录到文本文件中.下面本文将向大家介绍如何将log4net记录到数据库中. 经过前面的介绍,我想大家对使用log4net的过程已经很熟悉了,下面直接贴上log4net存日志到数据库的配置内容: 将前面log4net.config文件的root节点和appender节点替换为下面的内容, <root> <level value="ALL"/> <appender-ref ref=&quo

[转]如何配置Log4Net使用Oracle数据库记录日志

本文转自:http://www.cnblogs.com/PatrickLiu/p/6012153.html 最近在做一个项目的时候,需要增加一个日志的功能,需要使用Log4Net记录日志,把数据插入到Oracle数据库,经过好久的研究终于成功了.把方法记录下来,以备以后查询. 直接写实现方法,分两步完成: 1.使用NuGet Manager管理工具,增加对Oracle.ManagedDataAccess.dll的引用. 2.配置具体的文件. <?xml version="1.0"

[转]C#使用Log4Net记录日志

第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的  log4net-1.2.11-bin-newkey解压后,如下图所示: 双击bin文件夹 双击net文件夹,选择针对.NET FramerWork的不同版本 找到相应版本的log4net.dll. 第二步:应用Log4Net 1.在项目中添加Log4Net.DLL的引用 开发环境:XP Professional Service Pack3

使用log4net连接Mysql数据库配置

log4net配置: //Author:GaoBingBing [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 必备的组件: 1.log4net.dll 2.MySql.Data.dll log4net.config: <?xml version="1.0" encoding="utf-8" ?> <c

C#使用log4net记录日志 (转)

一.下载log4net.dll(百度云里面有)文件,然后再在项目中添加引用. 二.在AssemblyInfo.cs文件中添加log4net.dll的参数. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)] 三.右击项目→添加→新建项→xxx配置文件(web或者winform……)

C#Log4net记录日志(转)

C#Log4net记录日志 2018年11月25日 21:26:08 天外雁 阅读数:2084 1.下载log4net地址:http://logging.apache.org/log4net/download_log4net.cgi 下载log4net-2.0.8-bin-oldkey.zip到本地,根据自己的需求选择一个合适的log4net.dll版本即可. 2.log4net.dll放在 \bin\Release或者 \bin\Debug下. 3.解决方案下的引用中去引用该dll. 4.添加

Log4Net记录日志到SQLServer数据库

Log4Net配置步骤: 1.在项目中添加Log4Net引用,可在nuget包工具中下载 2.在项目中添加Log4Net.config文件并配置 <?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,