Log4Net 自定义字段记录到数据库

大家可能都用过Log4net插件来记录日志,该插件默认提供了这几个字段@log_date,@exception, @thread, @log_level, @logger, @message, 但是这并不能完全满足我们日常记录日志的需求,我们可能需要扩展自己所需的其他字段,来记录到数据库。例如,对于用户操作日志,我们可能需要记录操作人员ID或者姓名,或者操作类型或者操作信息等。

下面简单地介绍一下Log4Net 自定义字段记录到数据库:

第一步,当然是创建对应的数据库日志表,如下图所示:

第二步,配置Web.config,如下所示:

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <!--Database Output-->
    <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=10.10.120.98\SQLEXPRESS;database=manufacturingDev;User ID=sa;Password=nova123;" />
      <commandText value="INSERT INTO OperateLogs ([CreatedTime],[LastUpdatedTime],[Thread],[LogLevel],[Logger],[Message],[OperateType],[Detail],[UserId],[UserName]) VALUES (@log_date,@log_date1, @thread, @log_level, @logger, @message,@operatetype,@detail,@userid,@username)" />
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@log_date1"/>
        <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="255"/>
        <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="@operatetype"/>
        <dbType value="Int32"/>
        <layout type="CardsPocketsManufacturing.Infrastructure.Log4NET.ActionLayoutPattern">
          <conversionPattern value="%actionInfo{operatetype}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@detail"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="CardsPocketsManufacturing.Infrastructure.Log4NET.ActionLayoutPattern">
          <conversionPattern value="%actionInfo{detail}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@userid"/>
        <dbType value="Int32"/>
        <layout type="CardsPocketsManufacturing.Infrastructure.Log4NET.ActionLayoutPattern">
          <conversionPattern value="%actionInfo{userid}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@username"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="CardsPocketsManufacturing.Infrastructure.Log4NET.ActionLayoutPattern">
          <conversionPattern value="%actionInfo{username}"/>
        </layout>
      </parameter>

    </appender>
    <!-- Specify the level for some specific categories -->
    <root>
      <level value="ALL" name="OperateLogger" />
      <appender-ref ref="AdoNetAppender" />
    </root>
  </log4net>

第三步,创建Custom实体,ActionLoggerInfo,代码如下:

public class ActionLoggerInfo
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
        public int OperateType { get; set; }
        public string Detail { get; set; }
        public ActionLoggerInfo(int operatetpye, int userId, string userName, string detail)
        {
            this.OperateType = operatetpye;
            this.UserId = userId;
            this.UserName = userName;
            this.Detail = detail;
        }
    }

第四步,建立Custom转换器ActionConverter,代码如下:

 public class ActionConverter : PatternConverter
    {
        protected override void Convert(System.IO.TextWriter writer, object state)
        {
            if (state == null)
            {
                writer.Write(SystemInfo.NullText);
                return;
            }

            var loggingEvent = state as LoggingEvent;
            var actionInfo = loggingEvent.MessageObject as ActionLoggerInfo;

            if (actionInfo == null)
            {
                writer.Write(SystemInfo.NullText);
            }
            else
            {
                switch (this.Option.ToLower())
                {
                    case "userid":
                        writer.Write(actionInfo.UserId);
                        break;
                    case "username":
                        writer.Write(actionInfo.UserName);
                        break;
                    case "operatetype":
                        writer.Write(actionInfo.OperateType);
                        break;
                    case "detail":
                        writer.Write(actionInfo.Detail);
                        break;
                    default:
                        writer.Write(SystemInfo.NullText);
                        break;
                }
            }
        }
    }

第五步,创建LayoutPattern,ActionLayoutPattern,代码如下:

public class ActionLayoutPattern : PatternLayout
    {
        public ActionLayoutPattern()
        {
            AddConverter(new ConverterInfo
            {
                Name = "actionInfo",
                Type = typeof(ActionConverter)
            });
        }
    }

第六步,创建Log日志帮助类,LogUtil,代码如下:

public class LogUtil    {
        public LogUtil() { }

        private static ActionLoggerInfo _message = null;
        private static log4net.ILog _log;
        public static log4net.ILog Log
        {
            get
            {
                if (_log == null)
                {
                    _log = LogManager.GetLogger("OperateLogger");
                }
                return _log;
            }
        }
        public static void Debug()
        {
            if (Log.IsDebugEnabled)
            {
                Log.Debug(_message);
            }
        }
        public static void Error()
        {
            if (Log.IsErrorEnabled)
            {
                Log.Error(_message);
            }
        }
        public static void Fatal()
        {
            if (Log.IsFatalEnabled)
            {
                Log.Fatal(_message);
            }
        }
        public static void Info()
        {
            if (Log.IsInfoEnabled)
            {
                Log.Info(_message);
            }
        }
        public static void Warn()
        {
            if (Log.IsWarnEnabled)
            {
                Log.Warn(_message);
            }
        }
        /// <summary>
        /// call Log method
        /// </summary>
        /// <param name="operateType"></param>
        /// <param name="userId"></param>
        /// <param name="userName"></param>
        /// <param name="detail"></param>
        /// <param name="level"></param>
        public static void SaveMessage(int operateType, int userId, string userName, string detail, int level)
        {
            _message = new ActionLoggerInfo(operateType, userId, userName, detail);
            switch (level)
            {
                case 1: Info(); break;
                case 2: Warn(); break;
                case 3: Error(); break;
                case 4: Fatal(); break;
                default: break;
            }
        }
    }

到此完毕!!!!

Log4Net 自定义字段记录到数据库

时间: 2024-08-08 02:10:16

Log4Net 自定义字段记录到数据库的相关文章

关于log4net自定义字段写入不进数据库的问题

网上的教程上配置文件基本上都差不多 <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> <configSections> <section name="log4net" type="log4net.Config.Lo

Log4net 自定义字段到数据库

今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value="INSERT INTO xiao_log(Date,Thread,Level,Logger,Message)VALUES(@log_date, @thread, @log_level, @logger, @message)"/> 中的Date,Thread,Level,Logger,M

Log4net 自定义字段到数据库(二)

这种方法比第一种方法麻烦些 Log4Net.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- Author:GaoBingBing--> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfiguratio

Log4net 自定义字段 写入Oracle 使用ODP.NET Managed驱动

一.环境说明: 开发工具:vs2010   ,数据库:oracle 11g ,版本:log4net的目前最新版本1.2.13.0    :  Oracle.ManagedDataAccess.dll  Version 4.121.1.0 二.官网dll准备 log4net      http://mirrors.hust.edu.cn/apache//logging/log4net/binaries/log4net-1.2.13-bin-newkey.zip Oracle.ManagedData

敏捷工具leangoo配置自定义字段

做产品,最希望的是我的任务卡片可以灵活自定义,可以记录我想记录的所有信息.把重点信息画出来,一目了然.为了满足每个人不同的需求,Leangoo推出了自定义字段... 自定义字段可以为任务卡片添加扩展字段(比如“任务开始时间”“预计开始时间”“预计结束时间”,“电话”“邮箱”等等),根据需求随时定制你的任务卡片 我们来看看一些常用的应用场景: 一.Bug反馈 利用自定义字段记录bug的更多具体详细信息,如:bug产生的平台.来源.bug级别.反馈人等等,帮助开发快速找到问题. ? 二.销售客户管理

也用 Log4Net 之将日志记录到数据库的后台实现 (二)

 大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之前我先着重强调一下,“日志”的概念非常广泛,有错误日志.操作日志.访问日志.事件日志等等.我们并不提倡把所有的日志都记录到数据库,因为这样做没有必要.同时如果日志数据表与业务表同在一个数据库的话,频繁的记录日志的操作会影响性能(Log4Net提供了缓存机制,可以在缓存日志数据达到设定值,比如200条时,Log4Net会批量将数据录入到数据库中.即便是这么好的机

Log4net 使用之 自定义字段

Log4net 是.Net下一个非常优秀的开源日志记录组件.Log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介. 由于业务需要,计划为日志增加2个字段,除了Log4net默认字段,额外增加了LOG_TYPE 和 LOG_OPERATOR 两个字段用于对日志分类和记录相关操作的人员,以便于检索. 本文方法参考了StackOverFlow问答中的内容(https://stackoverflow.com/questions/12139486/log4net-

Log4Net 之将日志记录到数据库的后台实现 (二)

原文:Log4Net 之将日志记录到数据库的后台实现 (二) 大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之前我先着重强调一下,"日志"的概念非常广泛,有错误日志.操作日志.访问日志.事件日志等等.我们并不提倡把所有的日志都记录到数据库,因为这样做没有必要.同时如果日志数据表与业务表同在一个数据库的话,频繁的记录日志的操作会影响性能(Log4Net提供了缓存机制,可以在缓存日志数据达到设定值,比如

也用 Log4Net 之将日志记录到数据库的配置 (一)

也用 Log4Net  之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要不同的记录方式,比如利用数据库来记录,用txt的文件形式来记录,当然,这些都是最常用的记录方式.而且不同的业务组都希望有自己的记录数据表,不希望和其他业务组的数据混在一起.于是我先前设想的架构方式也就付之一炬了,因为不够灵活,而且实现难度大.周期长.恰在此时想起了之前做项目的时候用的 Log4Ne