log4net日志写入数据库

  1. 添加log4net.dll
  2. 添加配置(以控制台为例)

    log4net.config(添加)

    <?xml version="1.0" encoding="utf-8" ?>
    
    <log4net debug="false">
      <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
      <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
        <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
        <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=TestDB;Integrated Security=True" />
        <!--日志数据库脚本-->
        <commandText value="INSERT INTO LogDetails ([LogDate],[LogLevel],[LogMessage]) VALUES (@log_date,@log_level,@message)" />
        <!--日志时间 -->
        <parameter>
          <parameterName value="@log_date" />
          <dbType value="DateTime" />
          <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
    
        <!--日志级别 -->
        <parameter>
          <parameterName value="@log_level" />
          <dbType value="String" />
          <size value="20" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%p" />
          </layout>
        </parameter>
    
        <!--日志内容 -->
        <parameter>
          <parameterName value="@message" />
          <dbType value="String" />
          <size value="3000" />
          <layout type="Log4NetApply.MyLayout">
            <conversionPattern value="%property{Message}" />
          </layout>
        </parameter>
        <!--线程号-->
        <!--
        <parameter>
          <parameterName value="@thread" />
          <dbType value="String" />
          <size value="100" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%t" />
          </layout>
        </parameter>-->
        <!--日志名称-->
        <!--
        <parameter>
          <parameterName value="@logger" />
          <dbType value="String" />
          <size value="500" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
          </layout>
        </parameter>-->
        <!--<parameter>
          <parameterName value="@ActionsClick" />
          <dbType value="String" />
          <size value="4000" />
          <layout type="Log4NetApply.MyLayout" >
            <conversionPattern value = "%property{ActionsClick}"/>
          </layout>
        </parameter>
        -->
        <!--自定义UserName -->
        <!--
        <parameter>
          <parameterName value="@UserName" />
          <dbType value="String" />
          <size value="30" />
          <layout type="Log4NetApply.MyLayout" >
            -->
        <!--log4net.MDC.Set("UserName", "asdfasdf");
            <conversionPattern value = "%X{UserName}"/>-->
        <!--
            <conversionPattern value = "%property{UserName}"/>
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@UserIP" />
          <dbType value="String" />
          <size value="20" />
          <layout type="Log4NetApply.MyLayout" >
            <conversionPattern value = "%property{UserIP}"/>
          </layout>
        </parameter>-->
      </appender>
      <!-- setup the root category, add the appenders and set the default level -->
      <root>
        <appender-ref ref="ADONetAppender" />
      </root>
    </log4net>

    App.config (修改)

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      <log4net configSource="log4net.config"/>
      
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
      </startup>
    </configuration>

     

  3. 创建数据库(MSSQL)
    CREATE TABLE [dbo].[LogDetails](
    	[LogID] [int] IDENTITY(1,1) NOT NULL,
    	[LogDate] [datetime] NOT NULL,
    	[LogLevel] [nvarchar](20) NOT NULL,
    	[LogMessage] [nvarchar](3000) NOT NULL,
     CONSTRAINT [PK_LogDetails] PRIMARY KEY CLUSTERED 
    (
    	[LogID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
  4. 修改AssemblyInfo.cs

    //注意: ConfigFile 可以指定相对路径 和 绝对路径。
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
  5. 新增类

    LogPublicClass.cs

    using log4net.Layout;
    using log4net.Layout.Pattern;
    using System.Reflection;
    
    
    namespace Log4NetApply
    {
        /// <summary>
        /// 包含了所有的自定字段属性
        /// </summary>
        public class LogContent
        {
            public LogContent(string message)
            {
                Message = message;
            }
    
            /// <summary>
            /// 日志描述信息
            /// </summary>
            public string Message { get; set; }
        }
        public class MyLayout : PatternLayout
        {
            public MyLayout()
            {
                this.AddConverter("property", typeof(LogInfoPatternConverter));
            }
        }
    
        public class LogInfoPatternConverter : 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;
            }
        }
    }

    LogHelper.cs

    using log4net;
    using Log4NetApply;
    using System;
    
    namespace Log4Pro
    {
        public class LogHelper
        {
            public static readonly ILog loginfo = LogManager.GetLogger("INFO");
    
            public static readonly ILog logerror = LogManager.GetLogger("ERROR");
    
            public static readonly ILog logwarn = LogManager.GetLogger("WARN");
    
            public static readonly ILog logfatal = LogManager.GetLogger("FATAL");
    
             public static readonly ILog logdebug = LogManager.GetLogger("DEBUG");
    
            public static void Info(LogContent content)
            {
                loginfo.Info(content);
            }
    
            public static void Error(LogContent content, Exception ex)
            {
                logerror.Error(content, ex);
            }
    
            public static void Warn(LogContent content)
            {
                logwarn.Warn(content);
            }
    
            public static void Fatal(LogContent content)
            {
                logfatal.Fatal(content);
            }
    
            public static void Debug(LogContent content)
            {
                logdebug.Debug(content);
            }
        }
    }
    

     

  6. 调用端代码
     class Program
        {
            static void Main(string[] args)
            {
                //初始化配置
                XmlConfigurator.Configure();
    
                LogHelper.Info(new LogContent("这是一条普通信息"));
                LogHelper.Warn(new LogContent("这是一条警告信息"));
                LogHelper.Fatal(new LogContent("这是一条致命信息"));
                LogHelper.Debug(new LogContent("这是一条调试信息"));
                LogHelper.Error(new LogContent("这是一条错误信息"), new Exception("test"));
    
                Console.WriteLine("执行完成");
                Console.ReadLine();
            }
        }

    效果——

  7. 代码下载

    完整代码下载:https://pan.baidu.com/s/177kaNMeOPRs4SbI2-ZxPzg  0udu

    参考文章:https://blog.csdn.net/kongwei521/article/details/52242319

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值