log4net 自定义参数与数据库

接在来同样是配置文件

 <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <!-- ConversionPattern 解释
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):換行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
-->

    <!--定义输出到控制台命令行中-->
    <!--<logger name="myLogger">
      <level value="ALL"/>
      <appender-ref ref="ConsoleAppender" />
    </logger>-->

    <!--定义输出到控制台命令行中-->
    <!--<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="Log4NetTest.MyLayout">
        <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p %n用 户 ID:%Property{UserID} %n用户姓名:%Property{UserName} %n日志信息:%Property{Message} %n异常信息:%exception %n%n" />
      </layout>
    </appender>-->

    <!--定义输出到windows事件中-->
    <!--<appender name="WindowsAppender" type="log4net.Appender.EventLogAppender">
      <layout type="Log4NetTest.MyLayout">
        <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p %n用 户 ID:%Property{UserID} %n用户姓名:%Property{UserName} %n日志信息:%Property{Message} %n异常信息:%exception %n%n" />
      </layout>
    </appender>-->

    <!--定义输出到文件中--><!--
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <file value="E:/log4netfile.txt"/>
      --><!--是否在文件中追加日志信息--><!--
      <appendToFile value="true"></appendToFile>
      --><!--文件输出以日期方式滚动--><!--
      <rollingStyle value="Date"></rollingStyle>
      --><!--日志文件名以输出日期命名,可更改其他日期方式--><!--
      --><!--<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"></datePattern>--><!--
      --><!--表明输出的日志信息是否一直在同一文件中--><!--
      <staticLogFileName value="false"></staticLogFileName>
      --><!--备份文件的最大文件数目--><!--
      <param name="MaxSizeRollBackups" value="100"></param>
      <layout type="Log4NetTest.MyLayout">
        <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p %n用 户 ID:%Property{UserID} %n用户姓名:%Property{UserName} %n日志信息:%Property{Message} %n异常信息:%exception %n%n" />
      </layout>
    </appender>-->




    <!--定义输出到数据库-->
    <appender name="DataBaseAppender" type="log4net.Appender.ADONetAppender,log4net">
      <!--日志缓存写入条数-->
      <bufferSize value="0" />
      <!--日志数据库连接串-->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      

      <connectionString value="data source=.;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=123456;"/>
      <!--日志数据库脚本-->
      <commandText value="INSERT INTO LogInfo ([LogDate],[LogLevel],[UserId],[UserName],[Exception]) VALUES (@LogDate, @LogLevel,@UserId,@UserName,@Exception)" />
      <!--日志时间LogDate-->
      <parameter>
        <parameterName value="@LogDate" />
        <dbType value="String" />
        <size value="30" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" />
        </layout>
      </parameter>
      <!--日志类型LogLevel-->
      <parameter>
        <parameterName value="@LogLevel" />
        <dbType value="String" />
        <size value="10" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <!--自定义UserId-->
      <parameter>
        <parameterName value="@UserId" />
        <dbType value="String" />
        <size value="20" />
        <layout type="WindowsFormsApplication1.MyLayout">
          <conversionPattern value="%Property{UserID}" />
        </layout>
      </parameter>
      <!--自定义UserName-->
      <parameter>
        <parameterName value="@UserName" />
        <dbType value="String" />
        <size value="50" />
        <!--自定义的参数是来着与自己写的类的命名空间-->
        <layout type="WindowsFormsApplication1.MyLayout">
          <conversionPattern value="%Property{UserName}" />
        </layout>
      </parameter>
    
      <!--异常信息Exception-->
      <parameter>
        <parameterName value="@Exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    
    
    <logger name="logerror">
      <level value="INFO"/>
      <appender-ref ref="DataBaseAppender"/>
      <!--<appender-ref ref="RollingLogFileAppender"/>-->
    </logger>
    
  </log4net>





接下来要定义一个model,要与配置文件定义的参数一致

namespace WindowsFormsApplication1
{
    [Serializable]
    public class model
    {
        /// <summary>
        /// 用户ID
        /// </summary>
        public string UserID { get; set; }

        /// <summary>
        /// 用户姓名
        /// </summary>
        public string UserName { get; set; }
    }
}

然后定义一个MyLayout.cs

namespace WindowsFormsApplication1
{
    public class MyLayout:PatternLayout
    {
        public MyLayout()
        {
            //这里的Property是对于配置文件中自定义参数的,
            //用来配置文件的参数和后台定义的参数连接到一起
            this.AddConverter("Property", typeof(MyPatternConverter));
        }
    }
}
然后在定义一个MyPatternConverter.cs类
namespace WindowsFormsApplication1


{
    public class MyPatternConverter:PatternLayoutConverter
    {
        //这一步重写Convert方法,具体的作用,我也不太清除,
        //不会就是不会,不希望让你们理解错误
        protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            }
        }

        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;
        }
    }
}
	//然后就是实现方法作用的logHelper.cs类
	//用来实现操作
[assembly:log4net.Config.XmlConfigurator(Watch=true)]
namespace WindowsFormsApplication1
{
    public class logHelper
    {
        //根据log4net配置 声明不同的只读对象属性
        /// <summary>
        /// static 静态属性
        /// readonly 只读属性
        /// log4net.LogManager.GetLogger("loginfo") 使用的时候要和xml文件中的 <logger>匹配 读取的是<logger> 的 name 属性
        /// </summary>
        //根据logger name 声明一个封装类ILog对象  INFO 一般信息
        static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");       //一般性错误信息
        //static readonly log4net.ILog logmonitor = log4net.LogManager.GetLogger("logmonitor");   //监视信息
       // static readonly log4net.ILog mylog = log4net.LogManager.GetLogger("MyLogger");

        /// <summary>
        ///  获取一般错误性信息 
        /// </summary>
        /// <param name="ErrorMsg"></param>
        /// <param name="ex"></param>
        public static void Error(model ErrorMsg, Exception ex = null)
        {
            //根据参数不同,调用error的 不同重载方法
            if (ex != null)
            {
                logerror.Info(ErrorMsg, ex);
            }
            else
            {
                logerror.Info(ErrorMsg);
            }
        }
   

    }
}

	//最后是调用Helper类,完成操作
try
            {
                model mo = new model();
                mo.UserID = "12346";
                mo.UserName = "12345";
                logHelper.Error(mo);
            }
            catch (Exception EX)
            {
                EX.ToString();
            }
最后附上我写的代码 http://pan.baidu.com/s/1dFMIyOD




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值