效果图:

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

C# 利用log4net 把日志写入到数据库的更多相关文章

  1. C# 利用log4net 把日志写入到数据库表中

    效果图: 1:第一步创建SQL表结构  CREATE TABLE [dbo].[LogDetails] (  [LogID] int NOT NULL IDENTITY(1,1) ,  [LogDat ...

  2. c#用log4Net将日志写入到Oracle数据库,并写入到文件中

    原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:/ ...

  3. C# log4net 日志写入到数据库

    原文:C# log4net 日志写入到数据库 效果图: 1:第一步创建SQL表结构   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  4. log4net将日志写入ElasticSearch

    log4net将日志写入ElasticSearch https://www.cnblogs.com/huangxincheng/p/9120028.html 很多小步快跑的公司,开发人员多则3-4个, ...

  5. log4net 将日志写入数据库

    asp.net利用log4net写入日志到SqlServer数据库,Log4net是一个开源的错误日志记录项目,易用性强,源自log4j,品质值得信赖. 下面就我的安装部署log4net到MS sql ...

  6. 关于使用Log4Net将日志插入oracle数据库中

    1.关于配置文件. <?xml version="1.0" encoding="utf-8" ?> <configuration> &l ...

  7. .net core 中使用Log4net输出日志到Mysql数据库中

    .net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...

  8. log4net自定义字段写入SqlServer数据库 ASP.net

    首先申明,本示例经过本作者亲自试验通过,可以运行 第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置 <?xml version="1 ...

  9. C# 利用Log4Net进行日志记录

    概述 本文主要简单说明如何使用Log4Net进行日志记录,在程序开发过程中记录日志的优点: 它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug: 一旦在程序中加入了Log 输出 ...

随机推荐

  1. 解决 plsql 启动报错 Initialization error

    由于文件  oci.dll   路径没添加  1.点击edit 2.点击PL/SQL 3.弹框中 填写oci.dll文件的完整路径!完整路径!完整路径!完整路径!完整路径!完整路径!完整路径!完整路径 ...

  2. 2019 CSP-J 游记(CQ LNBS考场 的退役之战)

    T0.10 爆零之战 已经不是第一次参加NOIP了(哦,关于兔子也NOIP了) 这次比赛的话,感觉考场很温馨,键盘很舒适,老师很友善,下次还会来.(哦不,下次来不了了,即将提前退役[大雾]) 刚刚文化 ...

  3. ES-PHP向ES批量添加、查询文档报 No alive nodes found in your cluster

    转自: https://blog.csdn.net/itfootball/article/details/53637238 问题描述为了提高保存数据到es消耗的时间,采取积攒到3000条文档的时候才保 ...

  4. [转帖]亚马逊发布自主64核心ARM处理器:单核性能远超铂金至强

    亚马逊发布自主64核心ARM处理器:单核性能远超铂金至强 https://news.mydrivers.com/1/660/660383.htm 不知道真假 看样子比华为的鲲鹏920 要牛B . 亚马 ...

  5. [转帖]spring cloud架构

    spring cloud架构 https://www.cnblogs.com/xuzhaoyang/p/11010859.html 我们首先来说一下spring cloud的诞生的背景和意义 1 背景 ...

  6. Django-11-Form组件

    1. 概述 Django的Form组件一般功能有: 验证用户输入 生成html代码 返回错误信息 创建Form类 from django.shortcuts import render, redire ...

  7. POJ 1321 棋盘问题(C)回溯

    Emmm,我又来 POJ 了,这题感觉比上次做的简单点.类似皇后问题.但是稍微做了一点变形,比如棋子数量是不定的.棋盘形状不在是方形等等. 题目链接:POJ 1321 棋盘问题 解题思路 基本思路:从 ...

  8. window 包管理器--Chocolatey

    Chocolatey 介绍 在 Linux 下,大家喜欢用 apt-get 来安装应用程序,如今在 windows 下,大家可以使用 Chocolatey 来快速下载搭建一个开发环境. Chocola ...

  9. 2019 东方明珠java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东方明珠等公司offer,岗位是Java后端开发,最终选择去了东方明珠. 面试了很多家公司,感觉大部分公司考察的点 ...

  10. 30个关于Shell脚本的经典案例(下)

    本文目录 21.从FTP服务器下载文件 22.连续输入5个100以内的数字,统计和.最小和最大 23.将结果分别赋值给变量 24.批量修改文件名 25.统计当前目录中以.html结尾的文件总大 26. ...