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

这种方法比第一种方法麻烦些

Log4Net.config

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

  <!-- Author:GaoBingBing-->
  <configSections>
    <section  name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>

  <log4net>

    <!--写入到数据库-->
    <appender name="ADONetAppender_DbServer" type="log4net.Appender.AdoNetAppender">
      <!--错误队列数据达到5个才持久化到数据库-->
      <bufferSize value="1" />
      <param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/>
      <param name="ConnectionString" value="Data Source=ip;initial catalog=test;user id=test;password=****;pooling=true;min pool size=1; max pool size=5;Connection Timeout=100;"/>
      <commandText value="INSERT INTO xiao_log(Date,Thread,Level,Logger,Message,UserId,UserName)VALUES(@log_date, @thread, @log_level, @logger, @message,@userid,@username)"/>
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>

        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
        </layout>
        <!-- <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="50"/>
        <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="@userid"/>
        <dbType value="String" />
        <size value="255" />
        <layout type="Log4Net.MyLayout">[注意了:这里的Log4Net是命名空间 ,MyLayOut是类名]
          <conversionPattern value="%userid" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@username"/>
        <dbType value="String" />
        <size value="255" />
        <layout type="Log4Net.MyLayout">
          <conversionPattern value="%username" />
        </layout>
      </parameter>

    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="ADONetAppender_DbServer"/>

    </root>
    <!-- Specify the level for some specific categories -->
    <logger name="iNotes">
      <!-- <appender-ref ref="B" /> -->
      <level value="ALL"/>
      <appender-ref ref="ADONetAppender_DbServer"/>

    </logger>


  </log4net>
</configuration>
创建LogMessage.cs,类里面是所有的自定义字段属性

namespace Log4net
{
    public class LogMessage
    {
        public string _userid;

        public string _username;

        public LogMessage() { }

        public LogMessage(string userId, string userName)
        {
            _userid = userId;
            _username = userName;
        }

        public string UserId
        {
            get { return _userid; }
            set { _userid = value; }
        }

        public string UserName
        {
            get { return _username; }
            set { _username = value; }
        }

    }
}
创建  ParemterContent.cs  添加参数转换器类,每个字段一个模式转化类

namespace Log4net
{
    public class ParemterContent
    {
        internal sealed class UserIdParam : PatternLayoutConverter
        {
            // Methods  
            protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
            {
                LogMessage content = loggingEvent.MessageObject as LogMessage;
                if (content != null)
                {
                    writer.Write(content.UserId);
                }
            }
        }

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

    }
} 
创建 MyLayout.cs  这个是不是很眼熟 <layout type="Log4Net.MyLayout">


namespace Log4net
{
    internal class MyLayout : PatternLayout
    {

        public MyLayout()
        {
            this.AddConverter("username", typeof(ParemterContent.UserNameParam));
            this.AddConverter("userid", typeof(ParemterContent.UserIdParam));
        }
    }
}
    log4net.ILog loger = log4net.LogManager.GetLogger("iNotes");
                Log4net.LogMessage msg = new LogMessage("45", "dajiahao!");
                loger.Info(msg);
如果插入不成功需要检查  Ptoperties下面的AssemblyInfo.cs是不是加入了
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Global.asax是不是加入了
            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

如果缺少则需要加上。


如果还不成功 则检查Log4net.config配置文件,肯定xml中自定义属性有问题
原文地址:https://www.cnblogs.com/xiaoyaodijun/p/4686439.html