Log4Net 自訂欄位記錄到資料庫

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   資料   for   

      大家可能都用過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;            }        }    }
View Code

到此完畢!!!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.