效果图:

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

最新文章

  1. RPC框架性能基本比较测试
  2. Best 3D Modeling software under Ubuntu
  3. LeetCode 笔记系列六 Reverse Nodes in k-Group [学习如何逆转一个单链表]
  4. docker:从 tomcat 容器连接到 mysql 容器
  5. List 排序
  6. Httphelper工具1
  7. HttpWebRequest的简单使用
  8. CodeForces 757D Felicity&#39;s Big Secret Revealed(状压DP)
  9. python 错误之SyntaxError: Missing parentheses in call to &#39;print&#39;
  10. 支持向量机(SVM)举例
  11. LogXGEController: Error: XGE version 8.01 (build 1867) or higher is required for XGE shader
  12. Codevs1541[USACO]围墙涂色
  13. jenkins发版svn
  14. winform中的dateTimePicker控件设置默认值为空
  15. 002_HTTP每日分析及翻译
  16. WCF无法引入Model实体解决方案
  17. golang中的接口实现(一)
  18. Java Service Wrapper--来自官网文件
  19. I.MX6 OTG set as slave device hacking
  20. 你是否有遇到过某个实体类字段(属性)过多的情况,不想每次点的话戳进来(C# 反射)

热门文章

  1. python安装 错误 “User installations are disabled via policy on the machine”
  2. Zynq 7020笔记之 GPIO MIO 和EMIO的学习
  3. 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
  4. LeetCode 453. 最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements) 47
  5. Linux下 Nginx安装与配置(Centos7)
  6. 026 SSM综合练习02--数据后台管理系统--数据库表创建及SSM环境搭建
  7. lambd
  8. Django-04-路由系统
  9. DISPLAY FORMAT 語法
  10. aria config