Log4net保存自定义字段到数据库(以oracle为例)

概述

       Log4net保存自定义字段到数据库,此处以oracle数据库为例

实现

       1、下载log4net,添加log4net引用。 

       2、创建数据库

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)
)

  3、添加自定义字段的实体类  

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; }
         

    }
     

}

  4、添加参数转换器类,每个字段一个转化类

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);
                }
            }
        }
         

    } 
}

  5、添加自定义layout类

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 、添加配置信息

<?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>

  7、调用写入日志

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

总结

       添加自定义字段的实体类

  添加参数转换器类

  添加自定义layout类

    添加配置信息

       调用写入日志

若对您有用,请赞助个棒棒糖~

原文地址:https://www.cnblogs.com/shurun/p/14743482.html