• C# 利用log4net 把日志写入到数据库


    效果图:

    1:第一步创建SQL表结构
    1.  
      CREATE TABLE [dbo].[LogDetails] (
    2.  
      [LogID] int NOT NULL IDENTITY(1,1) ,
    3.  
      [LogDate] datetime NOT NULL ,
    4.  
      [LogThread] nvarchar(100) NOT NULL ,
    5.  
      [LogLevel] nvarchar(200) NOT NULL ,
    6.  
      [LogLogger] nvarchar(500) NOT NULL ,
    7.  
      [LogMessage] nvarchar(3000) NOT NULL ,
    8.  
      [LogActionClick] nvarchar(4000) NULL ,
    9.  
      [UserName] nvarchar(30) NULL ,
    10.  
      [UserIP] varchar(20) NULL
    11.  
      )

    2:创建项目然后下载log4net.dll 在项目中添加引用 http://logging.apache.org/log4net/download_log4net.cgi下载Binaries 下面的

    3:创建 log4net.config

    1.  
      <?xml version="1.0" encoding="utf-8" ?>
    2.  
       
    3.  
      <log4net debug="false">
    4.  
      <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
    5.  
      <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
    6.  
      <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
    7.  
      <bufferSize value="0" />
    8.  
      <!--日志数据库连接串-->
    9.  
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    10.  
      <connectionString value="DATABASE=GoodLook;SERVER=xx.xx.140.170;UID=sa;PWD=123456a;Connect Timeout=30;" />
    11.  
      <!--日志数据库脚本-->
    12.  
      <commandText value="INSERT INTO LogDetails ([LogDate],[LogThread],[LogLevel],[LogLogger],[LogActionClick],[LogMessage],[UserName],[UserIP]) VALUES (@log_date, @thread, @log_level, @logger, @ActionsClick, @message,@UserName,@UserIP)" />
    13.  
      <!--日志时间LogDate -->
    14.  
      <parameter>
    15.  
      <parameterName value="@log_date" />
    16.  
      <dbType value="DateTime" />
    17.  
      <layout type="log4net.Layout.RawTimeStampLayout" />
    18.  
      </parameter>
    19.  
      <!--线程号-->
    20.  
      <parameter>
    21.  
      <parameterName value="@thread" />
    22.  
      <dbType value="String" />
    23.  
      <size value="100" />
    24.  
      <layout type="log4net.Layout.PatternLayout">
    25.  
      <conversionPattern value="%t" />
    26.  
      </layout>
    27.  
      </parameter>
    28.  
      <!--日志类型LogLevel -->
    29.  
      <parameter>
    30.  
      <parameterName value="@log_level" />
    31.  
      <dbType value="String" />
    32.  
      <size value="200" />
    33.  
      <layout type="log4net.Layout.PatternLayout">
    34.  
      <conversionPattern value="%p" />
    35.  
      </layout>
    36.  
      </parameter>
    37.  
      <!--日志名称-->
    38.  
      <parameter>
    39.  
      <parameterName value="@logger" />
    40.  
      <dbType value="String" />
    41.  
      <size value="500" />
    42.  
      <layout type="log4net.Layout.PatternLayout">
    43.  
      <conversionPattern value="%logger" />
    44.  
      </layout>
    45.  
      </parameter>
    46.  
      <parameter>
    47.  
      <parameterName value="@message" />
    48.  
      <dbType value="String" />
    49.  
      <size value="3000" />
    50.  
      <layout type="Log4NetApply.MyLayout">
    51.  
      <conversionPattern value="%property{Message}" />
    52.  
      </layout>
    53.  
      </parameter>
    54.  
      <parameter>
    55.  
      <parameterName value="@ActionsClick" />
    56.  
      <dbType value="String" />
    57.  
      <size value="4000" />
    58.  
      <layout type="Log4NetApply.MyLayout" >
    59.  
      <conversionPattern value = "%property{ActionsClick}"/>
    60.  
      </layout>
    61.  
      </parameter>
    62.  
      <!--自定义UserName -->
    63.  
      <parameter>
    64.  
      <parameterName value="@UserName" />
    65.  
      <dbType value="String" />
    66.  
      <size value="30" />
    67.  
      <layout type="Log4NetApply.MyLayout" >
    68.  
      <!--log4net.MDC.Set("UserName", "asdfasdf");
    69.  
      <conversionPattern value = "%X{UserName}"/>-->
    70.  
      <conversionPattern value = "%property{UserName}"/>
    71.  
      </layout>
    72.  
      </parameter>
    73.  
      <parameter>
    74.  
      <parameterName value="@UserIP" />
    75.  
      <dbType value="String" />
    76.  
      <size value="20" />
    77.  
      <layout type="Log4NetApply.MyLayout" >
    78.  
      <conversionPattern value = "%property{UserIP}"/>
    79.  
      </layout>
    80.  
      </parameter>
    81.  
      </appender>
    82.  
      <!-- setup the root category, add the appenders and set the default level -->
    83.  
      <root>
    84.  
      <level value="Warn"/><!-- 定义记录的日志级别-->
    85.  
      <level value="Info"/>
    86.  
      <level value="Debug"/>
    87.  
      <level value="Fine"/>
    88.  
      <appender-ref ref="ADONetAppender" /><!-- 记录到什么介质中-->
    89.  
      </root>
    90.  
      <!-- specify the level for some specific categories -->
    91.  
      <!--//关于上边root到logger这块,如果同时出现,有可能会出现重复插入记录的情况:-->
    92.  
      <!--<logger name="iNotes">
    93.  
      <level value="WARN"/>
    94.  
      <level value="INFO"/>
    95.  
      <level value="DEBUG"/>
    96.  
      <level value="FINE"/>
    97.  
      <appender-ref ref="ADONetAppender"/>
    98.  
      </logger>
    99.  
      <logger name="StellaLogger">
    100.  
      <level value="ALL"/>
    101.  
      <appender-ref ref="AdoNetAppender" />
    102.  
      </logger>-->
    103.  
      <appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
    104.  
       
    105.  
      <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
    106.  
      <param name="File" value="D:/Log/" />
    107.  
       
    108.  
      <!--是否追加到文件-->
    109.  
      <param name="AppendToFile" value="true" />
    110.  
       
    111.  
      <!--记录日志写入文件时,不锁定文本文件-->
    112.  
      <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
    113.  
       
    114.  
      <!--Unicode编码-->
    115.  
      <!--<Encoding value="UTF-8" />-->
    116.  
       
    117.  
      <!--最多产生的日志文件数,value="-1"为不限文件数-->
    118.  
      <!--<param name="MaxSizeRollBackups" value="10" />-->
    119.  
       
    120.  
      <!--是否只写到一个文件中-->
    121.  
      <param name="StaticLogFileName" value="false" />
    122.  
       
    123.  
      <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
    124.  
      <param name="RollingStyle" value="Composite" />
    125.  
       
    126.  
      <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]-->
    127.  
      <param name="DatePattern" value="yyyy-MM-dd/"ReflectionLayout.log"" />
    128.  
      <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />-->
    129.  
      <!--<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />-->
    130.  
       
    131.  
      <!--每个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增加1重新命名-->
    132.  
      <param name="maximumFileSize" value="500KB" />
    133.  
       
    134.  
      <!--记录的格式。-->
    135.  
      <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
    136.  
      <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />
    137.  
      </layout>
    138.  
      </appender>
    139.  
       
    140.  
       
    141.  
       
    142.  
       
    143.  
      </log4net>

    4:在Web.config 里面加 configSections 节点 (CS可直接写在app.config里面,或者都写在一个config里面)

    1.  
      <configuration>
    2.  
      <strong> <span style="color:#FF0000;"> <configSections>
    3.  
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    4.  
      </configSections>
    5.  
      <log4net configSource="log4net.config"/></span></strong>
    6.  
       
    7.  
      <system.web>
    8.  
      <compilation debug="true" targetFramework="4.5" />
    9.  
      <httpRuntime targetFramework="4.5" />
    10.  
      </system.web>
    11.  
       
    12.  
      </configuration>

    5:Properties 属性下面的AssemblyInfo.cs 追加 必须有这个,否则写入不到数据库中
    1.  
      //[assembly: log4net.Config.XmlConfigurator(Watch = true)]
    2.  
      //注意: ConfigFile 可以指定相对路径 和 绝对路径。 eg: /log/xxxx.log 或者 d://log//xxxx.log
    3.  
      [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

    6:添加 Global.asax

    然后在Application_Start 追加 读取配置程序文件

    1.  
      protected void Application_Start(object sender, EventArgs e)
    2.  
      {
    3.  
      //应用程序启动时,自动加载配置log4Net
    4.  
      XmlConfigurator.Configure();
    5.  
      }
    7:创建自定义类 LogPublicClass.cs,为了方便写入数据库中 自定义的一些信息
    1.  
      using log4net.Layout;
    2.  
      using log4net.Layout.Pattern;
    3.  
      using System;
    4.  
      using System.Collections.Generic;
    5.  
      using System.Linq;
    6.  
      using System.Reflection;
    7.  
      using System.Web;
    8.  
       
    9.  
      namespace Log4NetApply
    10.  
      {
    11.  
      /// <summary>
    12.  
      /// 包含了所有的自定字段属性
    13.  
      /// </summary>
    14.  
      public class LogContent
    15.  
      {
    16.  
      public LogContent(string macAddress, string computerName, string actionsclick, string description)
    17.  
      {
    18.  
      UserIP = macAddress;
    19.  
      UserName = computerName;
    20.  
      ActionsClick = actionsclick;
    21.  
      Message = description;
    22.  
      }
    23.  
       
    24.  
      /// <summary>
    25.  
      /// 访问IP
    26.  
      /// </summary>
    27.  
      public string UserIP { get; set; }
    28.  
       
    29.  
      /// <summary>
    30.  
      /// 系统登陆用户
    31.  
      /// </summary>
    32.  
      public string UserName { get; set; }
    33.  
       
    34.  
      /// <summary>
    35.  
      /// 动作事件
    36.  
      /// </summary>
    37.  
      public string ActionsClick { get; set; }
    38.  
       
    39.  
      /// <summary>
    40.  
      /// 日志描述信息
    41.  
      /// </summary>
    42.  
      public string Message { get; set; }
    43.  
       
    44.  
       
    45.  
      }
    46.  
      public class MyLayout : PatternLayout
    47.  
      {
    48.  
      public MyLayout()
    49.  
      {
    50.  
      this.AddConverter("property", typeof(LogInfoPatternConverter));
    51.  
      }
    52.  
      }
    53.  
       
    54.  
      public class LogInfoPatternConverter : PatternLayoutConverter
    55.  
      {
    56.  
       
    57.  
      protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    58.  
      {
    59.  
      if (Option != null)
    60.  
      {
    61.  
      // Write the value for the specified key
    62.  
      WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
    63.  
      }
    64.  
      else
    65.  
      {
    66.  
      // Write all the key value pairs
    67.  
      WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
    68.  
      }
    69.  
      }
    70.  
      /// <summary>
    71.  
      /// 通过反射获取传入的日志对象的某个属性的值
    72.  
      /// </summary>
    73.  
      /// <param name="property"></param>
    74.  
      /// <returns></returns>
    75.  
       
    76.  
      private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
    77.  
      {
    78.  
      object propertyValue = string.Empty;
    79.  
      PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
    80.  
      if (propertyInfo != null)
    81.  
      propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
    82.  
      return propertyValue;
    83.  
      }
    84.  
      }
    85.  
      }

    8:示例使用
    1.  
      try
    2.  
      {
    3.  
      log.Info(new LogContent("127.0.0.1", "111111", "登陆系统", "登陆成功"));
    4.  
      var ss = 1 - int.Parse("sss");
    5.  
      }
    6.  
      catch(Exception ex)
    7.  
      {
    8.  
      log.Error(new LogContent("127.0.0.1", "111111", "登陆系统", ex.Message+":"+ex.StackTrace));
    9.  
      }

    其他自行参考下列文章
    1.  
      http://www.cnblogs.com/kissazi2/p/3393151.html
    2.  
      http://blog.csdn.net/zdw_wym/article/details/48802821
    3.  
      http://blog.csdn.net/ydm19891101/article/details/50561638
    4.  
      http://www。w2bc。com/Article/70140
    5.  
      http://www.cnblogs.com/yuangang/archive/2016/05/16/5497140.html

    出处:https://blog.csdn.net/kongwei521/article/details/52242319

  • 相关阅读:
    ISAPI_Rewrite规则写法
    用Windows 2003配置邮件服务器
    如何保护.net中的dll文件(防破解、反编译)
    The Tao Of Programming 编程之道
    Request.ServerVariables (server environment variable)
    Windows下搭建Subversion 服务器
    邮件服务器反解析退信问题分析
    关于公网和内网之间Socket的通信
    .net安装部署中添加卸载程序简单方法
    构建高性能ASP.NET站点 剖析页面处理过程
  • 原文地址:https://www.cnblogs.com/mq0036/p/11139340.html
Copyright © 2020-2023  润新知