1. 程式人生 > >關於使用Log4Net將日誌插入oracle數據庫中

關於使用Log4Net將日誌插入oracle數據庫中

override logging 1.7 包含 pen 格式化 netapp 註冊 style

1.關於配置文件。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section   name="log4net"   type="System.Configuration.IgnoreSectionHandler"   />
  </configSections>
  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="rollingFile" />
      <appender-ref ref="ADONetAppender"/>
    </root>
    <logger name="Presin_log">
      <level value="ALL" />
      <appender-ref ref="PresinLoging" />
    </logger>
    <logger name="Oracle_DB">
      <level value="ALL" />
      <appender-ref ref="OracleDB" />
    </logger>
    <logger name="flowseting_log">
      <level value="ALL" />
      <appender-ref ref="flowsetingLoging" />
    </logger>
    <!--Presin日誌-->
    <appender name="PresinLoging" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="Log\Presin\" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Composite" />
      <param name="DatePattern" value="yyyy-MM-dd.‘.txt‘" />
      <param name="MaximumFileSize" value ="5MB"/>
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <conversionPattern value="%date %-5level %newline %logger - %message%newline %newline" />
      </layout>
    </appender>
    <appender name="OracleDB" type="log4net.Appender.AdoNetAppender,log4net" >
      <bufferSize value="20"/>
      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <connectionString value="Data Source=ORCl;User ID=sa;Password=sa;" />
      <commandText value="INSERT INTO LogDetails (LogDate,loglevel,loglogger,LogMessage,logfunctionname,logbusinessname) VALUES (:log_date,:log_level,:logger,:message,:FunctionName,:BusinessName)" />
      <parameter>
        <parameterName value=":log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" />
        </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="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":message" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{Message}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":FunctionName" />
        <dbType value="String" />
        <size value="200" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{FunctionName}" />
        </layout>
      </parameter>
    <parameter>
        <parameterName value=":BusinessName" />
        <dbType value="String" />
        <size value="200" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{BusinessName}" />
        </layout>
      </parameter>
    </appender>
    <!--flowseting日誌-->
    <appender name="flowsetingLoging" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="Log\flowseting\" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="yyyyMMdd" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <conversionPattern value="%date %-5level %newline %logger - %message%newline %newline"  />
      </layout>
    </appender>
  </log4net>
</configuration>

a.在配置文件中,root節點下需要增加<appender-ref ref="ADONetAppender"/>代表允許將日誌插入數據庫中。
<root>
      <level value="ALL" />
      <appender-ref ref="rollingFile" />
      <appender-ref ref="ADONetAppender"/>
    </root>

技術分享 rollingFile是將日誌寫入文件中,在這裏不做討論。 ADONetAppender是將日誌寫入數據庫中,然後log4Net會根據接下來的配置connectionType和connectionString判斷插入何種數據庫和哪個數據庫 b.增加一個logname,方便進一步添加屬性
<logger name="Oracle_DB">
      <level value="ALL" />
      <appender-ref ref="OracleDB" />
 </logger>

技術分享 c.進一步配置OracleDB
<appender name="OracleDB" type="log4net.Appender.AdoNetAppender,log4net" >
      <bufferSize value="20"/>
      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <connectionString value="Data Source=ORCl;User ID=sa;Password=sa;" />
      <commandText value="INSERT INTO LogDetails (LogDate,loglevel,loglogger,LogMessage,logfunctionname,logbusinessname) VALUES (:log_date,:log_level,:logger,:message,:FunctionName,:BusinessName)" />
      <parameter>
        <parameterName value=":log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" />
        </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="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":message" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{Message}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":FunctionName" />
        <dbType value="String" />
        <size value="200" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{FunctionName}" />
        </layout>
      </parameter>
    <parameter>
        <parameterName value=":BusinessName" />
        <dbType value="String" />
        <size value="200" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{BusinessName}" />
        </layout>
      </parameter>
    </appender>

技術分享 其中需要註意的是: (1).bufferSize,代表緩存的記錄條數,設置為20,表示log4net會在有20條日誌時調用數據庫並插入。 (2).connectionType代表數據庫類型,註意Version和PublicKeyToken一定要於自己系統調用的版本一致。oracle的2.0版本的System.Data.OracleClient一般是2.0.0.0和b77a5c561934e089 (3)commandText代表插入的語句,註意oracle的參數是:參數,[email protected],且此處一定要保證,sql語句正確,如數據庫中無此表或表無此字段,log4Net都不會報錯,但不會進行任何操作。 (4)通過parameter逐一將要插入數據庫的參數進行賦值和格式化 如:日期格式化和賦值
<parameter>
        <parameterName value=":log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" />
        </layout>
</parameter>

技術分享 字符串默認格式化和賦值
      <parameter>
        <parameterName value=":logger" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>

技術分享 log4Net提供給我們的字段有: log_date,log_level,logger,message等,其余的字段需要我們自定義 自定義字段格式化和賦值
      <parameter>
        <parameterName value=":FunctionName" />
        <dbType value="String" />
        <size value="200" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{FunctionName}" />
        </layout>
      </parameter>

技術分享 log4Net提供的字段,我們也可以通過自定義重載
      <parameter>
        <parameterName value=":message" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="MapgisEgovLog4_WriteLog.MyLayout">
          <conversionPattern value="%property{Message}" />
        </layout>
      </parameter>

技術分享 註意:layout Type中填寫的是og4net的格式化類以及其命名空間。 conversionPattern中是使用擴展的格式化類中註冊的格式化方法。 擴展格式化需要一些後臺代碼支持
/// <summary>  
    /// 包含了所有的自定字段屬性  
    /// </summary>  
    public class LogContent
    {
        public LogContent(string sFunctionName, string sLogMessasge,string sLogBusinessName)
        {
            FunctionName = sFunctionName;
            Message = sLogMessasge;
            BusinessName = sLogBusinessName;
        }

        /// <summary>  
        /// 方法名稱  
        /// </summary>  
        public string FunctionName { get; set; }

        /// <summary>  
        /// 日誌描述信息  
        /// </summary>  
        public string Message { get; set; }

        /// <summary>
        /// 業務名稱
        /// </summary>
        public string BusinessName { get; set; }
    }


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

    public class LogInfoPatternConverter : PatternLayoutConverter
    {

        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                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;
        }
    }
其中: d.自定義字段的類
    public class LogContent
    {
        public LogContent(string sFunctionName, string sLogMessasge,string sLogBusinessName)
        {
            FunctionName = sFunctionName;
            Message = sLogMessasge;
            BusinessName = sLogBusinessName;
        }

        /// <summary>  
        /// 方法名稱  
        /// </summary>  
        public string FunctionName { get; set; }

        /// <summary>  
        /// 日誌描述信息  
        /// </summary>  
        public string Message { get; set; }

        /// <summary>
        /// 業務名稱
        /// </summary>
        public string BusinessName { get; set; }
    }

技術分享 e.擴展log4net的格式化方法
public class MyLayout : PatternLayout
    {
        public MyLayout()
        {
            this.AddConverter("property", typeof(LogInfoPatternConverter));
        }
    }

技術分享 f.通過反射的方法獲取LogContent中定義的字段
public class LogInfoPatternConverter : PatternLayoutConverter
    {

        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                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.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(strPath + "配置文件.xml"));
 ILog log = LogManager.GetLogger("Oracle_DB");
log.Info(new LogContent("Button1_Click", "測試成功","測試"));

參考:

http://blog.csdn.net/kongwei521/article/details/52242319

關於使用Log4Net將日誌插入oracle數據庫中