效果图:

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

<?xml version="1.0" encoding="utf-8" ?>

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

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

<configuration>

<strong> <span style="color:#FF0000;"> <configSections>

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

</configSections>

<log4net configSource="log4net.config"/></span></strong>

<system.web>

<compilation debug="true" targetFramework="4.5" />

<httpRuntime targetFramework="4.5" />

</system.web>

</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,为了方便写入数据库中 自定义的一些信息

using log4net.Layout;

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

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.  }

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

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

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

  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. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  6. File操作-将txt里的内容写入到数据库表

    package com.Cristin.File;//将txt里的内容写入到数据库表 import com.Cristin.MySQL.AddDataToDB;import org.testng.an ...

  7. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  8. 将DataFrame数据如何写入到Hive表中

    1.将DataFrame数据如何写入到Hive表中?2.通过那个API实现创建spark临时表?3.如何将DataFrame数据写入hive指定数据表的分区中? 从spark1.2 到spark1.3 ...

  9. 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件

    本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar 工作中曾有个为42张表建立测 ...

随机推荐

  1. 线上日志集中化可视化管理:ELK

    本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...

  2. django系列7.2--django中的cookie和session基本操作,浏览器登陆验证的不同实现

    django中的cookie和session(02)–操作 一.Django中的cookie操作 ctrl + shift + del 是谷歌浏览器中清除页面缓存和cookie的快捷键 1.设置coo ...

  3. 构造函数(JAVA)

    构造函数 :是一种特殊的方法,主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中. 特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类 ...

  4. “全栈2019”Java第一百一十三章:什么是回调?回调应用场景详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. kali linux之msf后渗透阶段

    已经获得目标操作系统控制权后扩大战果 提权 信息收集 渗透内网 永久后门 基于已有session扩大战果 绕过UAC限制 use exploit/windows/local/ask set sessi ...

  6. 利用C# CefSharp Python采集某网站简历并自动发送邀请短信

    以往爬虫没怎么研究过,最近有个需求,要从某网站采集敏感信息,稍稍考虑了一下,决定利用C# Winform和Python一起来解决这个事件. 整个解决方案不复杂:C#编写WinForm窗体,进行数据分析 ...

  7. Windows server 2008启动remote dosktop services服务报错1079

    原创 欢迎转载,届时请注明出处 报错场景 今天,刚开始启动win server的远程连接服务(remote desktop services)时 该服务可以正常启动,然后选择了  “计算机--> ...

  8. ecshop后台0day漏洞原理+利用方法 XSS+Getshll

    发布日期:2012-10.25 发布作者:dis9@ztz 漏洞类型:跨站攻击 代码执行 0x0 后台getshell 在 includes/cls_template.php fetch函数 /** ...

  9. Kali Linux来袭~老司机带你进击

    Kali是BackTrackLinux完全遵循Debian开发标准彻底的完全重建.全新的目录框架,复查并打包所有工具,我们还为VCS建立了Git树. 本次推荐内容主要介绍Kali-Linux的安装,包 ...

  10. 为解决Samba windows 无法访问 尝试过的方法

    1, 通过   vi /etc/sysconfig/selinux 把 SELINUX=enforcing   修改为SELINUX= disable 退出保存,并且重启.(设置了) 2, 把wind ...