log4net使用实例

log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文以CS应用程序为例,在VS2012中来配置并使用log4net写日志到数据库。

一、建数据库表

二、新建日志类库

1.新建Log类库,这样日志库方便移植,Log类库中包含以下文件:

/// <summary>
    /// 日志实体类
    /// </summary>
    public class LogMessage
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 内容
        /// </summary>
        public string Content { get; set; }
    }


/// <summary>
    /// 日志业务逻辑
    /// </summary>
    public class Log
    {
        private ILog logger;
        
        public Log(Type type)
        {
            //加载log4net配置
            log4net.Config.XmlConfigurator.Configure();
            this.logger = log4net.LogManager.GetLogger(type);
        }

        public void Info(LogMessage message)
        {
            Console.WriteLine(message.Title + message.Content);
            this.logger.Info(message);
        }
        public void Error(LogMessage message)
        {
            Console.WriteLine(message.Title + message.Content);
            this.logger.Error(message);
        }
        public void Error(LogMessage message, Exception ex)
        {
            Console.WriteLine(message.Title + message.Content);
            this.logger.Error(message, ex);
        }
        public void Debug(LogMessage message)
        {
            Console.WriteLine(message.Title + message.Content);
            this.logger.Debug(message);
        }
        public void Warn(LogMessage message)
        {
            Console.WriteLine(message.Title + message.Content);
            this.logger.Warn(message);
        }
/// <summary>
    /// 属性转换
    /// </summary>
    public class MyLayout : PatternLayout
    {
        public MyLayout()
        {
            this.AddConverter("property", typeof(MyMessagePatternConverter));
        }
    }
/// <summary>
    /// 实体属性转换
    /// </summary>
    public class MyMessagePatternConverter : PatternLayoutConverter
    {
        protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                // Write the value for the specified key  
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                // Write all the key value pairs  
                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;
        }  
    }

2.添加引用和配置

    2.1.Log类库添加对log4net的引用,我引用的版本是:log4net.2.0.3\net20-full\log4net.dll。

    2.2. 应用程序配置文件中加入log4net的配置,如下:

    注:<configSections>这个配置项要紧跟在<configuration>下,另外如果数据库连接配置错误,启动会报错

    

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  
  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>
  
  <system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add
            name="textWriterTraceListener"
            type="System.Diagnostics.TextWriterTraceListener"
            initializeData="C:\Log4NetDebug1.txt" />
      </listeners>
    </trace>
  </system.diagnostics>

  <log4net>
    <root>
      <!--<level value="All" />-->
      <appender-ref ref="AdoNetAppender"/>
    </root>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1"/>
      <connectionType value="System.Data.SqlClient.SqlConnection,System.Data, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
      <connectionString value=".;Database=db;User ID=sa;Password=123456;"/>
      <commandText value="INSERT INTO T_log(LogLevel,Title,Content) VALUES (@LogLevel,@Title,@Content)"/>

      <parameter>
        <parameterName value="@LogLevel"/>
        <dbType value="String"/>
        <size value="20"/>
        <layout type="log4net.Layout.PatternLayout" value="%level"/>
      </parameter>

      <!--<parameter>
        <parameterName value="@LogLevel" />
        <dbType value="String" />
        <size value="10" />
        <layout type="Log.MyLayout, Log">
          <param name="ConversionPattern"  value="%property{LogLevel}"></param>
        </layout>
      </parameter>-->

      <parameter>
        <parameterName value="@Title"/>
        <dbType value="String"/>
        <size value="200"/>
        <layout type="Log.MyLayout, Log">
          <param name="ConversionPattern" value="%property{Title}"></param>
        </layout>
      </parameter>

      <parameter>
        <parameterName value="@Content"/>
        <dbType value="String"/>
        <size value="2000"/>
        <layout type="Log.MyLayout, Log">
          <param name="ConversionPattern" value="%property{Content}"></param>
        </layout>
      </parameter>

    </appender>
  </log4net>

三、使用Log日志类库

        在其他项目中引用Log类库,新建日志对象,如下:

        /// <summary>
        /// 日志
        /// </summary>
        private static readonly Log log = new Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


        private LogMessage logmsg = new LogMessage();

        //写日志

        logmsg.Title = "测试";
        logmsg.Content =“测试内容”; 
        log.Error(logmsg);

在使用的过程中,有时候日志没有写进数据库,不知道什么原因,知道的大神可以指点下,谢谢。

                       

    

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值