Log4net保存自定義字段到數據庫(以oracle爲例)

概述

       Log4net保存自定義字段到數據庫,此處以oracle數據庫爲例sql

實現

       一、下載log4net,添加log4net引用。 數據庫

       二、建立數據庫express

CREATE TABLE TASKDB.WORKFLOWLOGS
(
  LOG_ID NUMBER NOT NULL,
  LOG_USERID VARCHAR2(100 BYTE),
  LOG_OPERATERTYPE VARCHAR2(100 BYTE),
  LOG_MESSAGE VARCHAR2(4000 BYTE),
  LOG_DATE DATE,
  LOG_LEVEL VARCHAR2(255 BYTE),
  LOG_IDENTITY VARCHAR2(255 BYTE),
  LOG_EXCEPTION VARCHAR2(4000 BYTE),
  LOG_LOGGER VARCHAR2(255 BYTE),
  LOG_SOURCE VARCHAR2(1000 BYTE)
)oracle

  三、添加自定義字段的實體類  app

namespace Log4NetToDatabase
{
    /// <summary>
    /// 包含了全部的自定字段屬性
    /// </summary>
    public class LogContent : IRequiresSessionState
    {

        public LogContent(string _UserId, string _OperaterType, string _Message)
        {
            UserId = _UserId;
            OperaterType = _OperaterType;
            Message = _Message;
        } 

        public string UserId { get; set; }
        public string OperaterType { get; set; }
        public string Message { get; set; }
         

    }
     

}

 

  四、添加參數轉換器類,每一個字段一個轉化類ide

namespace Log4NetToDatabase
{
    public class Log4NetConvert
    {
        internal sealed class UserIdPatternConverter : PatternLayoutConverter
        {
            override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
            {
                LogContent content = loggingEvent.MessageObject as LogContent;
                if (content != null)
                {
                    writer.Write(content.UserId);
                }
            }
        }

        internal sealed class OperaterTypePatternConverter : PatternLayoutConverter
        {
            override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
            {
                LogContent content = loggingEvent.MessageObject as LogContent;
                if (content != null)
                {
                    writer.Write(content.OperaterType);
                }
            }
        }


        internal sealed class MessagePatternConverter : PatternLayoutConverter
        {
            override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
            {
                LogContent content = loggingEvent.MessageObject as LogContent;
                if (content != null)
                {
                    writer.Write(content.Message);
                }
            }
        }
         

    } 
}

  五、添加自定義layout類sqlserver

namespace Log4NetToDatabase
{
    public class CustomLayout : PatternLayout
    {
        public CustomLayout()
        {
            //this.AddConverter("property", typeof(Log4NetConvert));
            this.AddConverter("UserId", typeof(Log4NetConvert.UserIdPatternConverter));
            this.AddConverter("OperaterType", typeof(Log4NetConvert.OperaterTypePatternConverter));
            this.AddConverter("Message", typeof(Log4NetConvert.MessagePatternConverter));
        }
    }
}

 

  6 、添加配置信息ui

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <log4net>
        <!--日誌記錄器-->
        <logger name="OperationLog" additivity="false">
            <level value="ALL"/>
            <!--設置使用的數據庫記錄器-->
            <appender-ref ref="AdoNetAppender_Operation"/>
        </logger>

        <!--數據庫記錄器-->
        <appender name="AdoNetAppender_Operation" type="log4net.Appender.AdoNetAppender">
            <!--sqlserver日誌數據庫鏈接串-->
            <!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <connectionString value="Data Source=.\sqlexpress;initial catalog=kuiyu.net;User ID=sa;Password=1"  providerName="System.Data.SqlClient"/>-->
            <!--oracle日誌數據庫鏈接串-->
            <connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/> 
            <connectionString value="Data Source=//localhost:1521/orcl;User ID=xxxxdb;Password=xxxxdb;"/>

            <!--日誌數據庫腳本-->
            <commandText value="INSERT INTO WORKFLOWLOGS (LOG_ID,LOG_USERID,LOG_OPERATERTYPE,  LOG_MESSAGE, LOG_DATE, LOG_LEVEL, LOG_IDENTITY, LOG_EXCEPTION, LOG_LOGGER, LOG_SOURCE) VALUES (WORKFLOWLOGS_SEQ.nextval,
                     :UserId,:OperaterType, :Message,:log_date, :log_level, :log_identity,:log_exception, :logger, :source )" />
 
            <bufferSize value="1"/>
            <!--自定義成員 -->

            <parameter>
                <parameterName value=":UserId" />
                <dbType value="String" />
                <size value="1000" />
                <layout type="Log4NetToDatabase.CustomLayout">
                    <conversionPattern value="%UserId" />
                </layout> 
            </parameter>

            <parameter>
                <parameterName value=":OperaterType" />
                <dbType value="String" />
                <size value="1000" />
                <layout type="Log4NetToDatabase.CustomLayout">
                    <conversionPattern value="%OperaterType" />
                </layout> 
            </parameter>


            <parameter>
                <parameterName value=":Message" />
                <dbType value="String" />
                <size value="4000" />
                <layout type="Log4NetToDatabase.CustomLayout">
                    <conversionPattern value="%Message" />
                </layout> 
            </parameter>

            <parameter>
                <parameterName value=":log_date" />
                <dbType value="DateTime" />
                <layout type="log4net.Layout.RawTimeStampLayout">
                </layout>
            </parameter>
            <parameter>
                <parameterName value=":log_level" />
                <dbType value="String" />
                <size value="10" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%level" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value=":log_identity" />
                <dbType value="String" />
                <size value="100" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%identity" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value=":log_exception" />
                <dbType value="String" />
                <size value="4000" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%exception" />
                </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=":source" />
                <dbType value="String" />
                <size value="1000" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%file:%line" />
                </layout>
            </parameter>
            
        </appender>
        
        
        
    </log4net>
</configuration>

 

  七、調用寫入日誌this

ILog log = log4net.LogManager.GetLogger("OperationLog"); 
log.Info(new LogContent(dt_user.Rows[0]["userid"].ToString(), "登陸", "登錄系統"));

 

 

 

總結

       添加自定義字段的實體類spa

  添加參數轉換器類

  添加自定義layout類

    添加配置信息

       調用寫入日誌

 

若對您有用,請贊助個棒棒糖~

相關文章
相關標籤/搜索