LOG4数据库记录器XML配置

  1. 1 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
  2. 2 <!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
  3. 3 <bufferSize value="1"/>
  4. 4 <Threshold value="Error" />
  5. 5 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  6. 6 <connectionString value="Data Source=USER-20190520KW;Initial Catalog=SiteLogs;Connect Timeout=30;Persist Security Info=True;User ID=electricdb;Password=888888;Max Pool Size = 32767"/>
  7. 7 <commandText value="INSERT INTO T_SiteLogs ([LogDate],[LogThread],[LogLevel],[LogLogger],[LogMessage],[LogException],[LogIp]) VALUES (@log_date, @log_thread, @log_level, @log_logger, @log_message, @log_exception,@log_ip)"/>
  8. 8 <parameter>
  9. 9 <parameterName value="@log_date"/>
  10. 10 <dbType value="DateTime"/>
  11. 11 <layout type="log4net.Layout.RawTimeStampLayout"/>
  12. 12 </parameter>
  13. 13 <parameter>
  14. 14 <parameterName value="@log_thread"/>
  15. 15 <dbType value="String"/>
  16. 16 <size value="255"/>
  17. 17 <layout type="log4net.Layout.PatternLayout">
  18. 18 <conversionPattern value="%thread"/>
  19. 19 </layout>
  20. 20 </parameter>
  21. 21 <parameter>
  22. 22 <parameterName value="@log_level"/>
  23. 23 <dbType value="String"/>
  24. 24 <size value="50"/>
  25. 25 <layout type="log4net.Layout.PatternLayout">
  26. 26 <conversionPattern value="%level"/>
  27. 27 </layout>
  28. 28 </parameter>
  29. 29 <parameter>
  30. 30 <parameterName value="@log_logger"/>
  31. 31 <dbType value="String"/>
  32. 32 <size value="255"/>
  33. 33 <layout type="log4net.Layout.PatternLayout">
  34. 34 <conversionPattern value="%logger"/>
  35. 35 </layout>
  36. 36 </parameter>
  37. 37 <parameter>
  38. 38 <parameterName value="@log_message"/>
  39. 39 <dbType value="String"/>
  40. 40 <size value="4000"/>
  41. 41 <layout type="log4net.Layout.PatternLayout">
  42. 42 <conversionPattern value="%message"/>
  43. 43 </layout>
  44. 44 </parameter>
  45. 45 <parameter>
  46. 46 <parameterName value="@log_exception"/>
  47. 47 <dbType value="String"/>
  48. 48 <size value="2000"/>
  49. 49 <layout type="log4net.Layout.ExceptionLayout"/>
  50. 50 </parameter>
  51. 51 <parameter>
  52. 52 <parameterName value="@log_ip"/>
  53. 53 <dbType value="String"/>
  54. 54 <size value="50"/>
  55. 55 <layout type="Electric.WebUI.ConsoleLog.IPatternLayout">
  56. 56 <conversionPattern value="%log_IP"/>
  57. 57 </layout>
  58. 58 </parameter>
  59. 59
  60. 60 </appender>
  1. @log_ip为客户端IP字段名称,名字可以自己取,INSERT语句顺序匹配上就行

    配置字段自定义处理程序:
  1. <parameter>
  2. <parameterName value="@log_ip"/>
  3. <dbType value="String"/>
  4. <size value="50"/>
  5. <layout type="Electric.WebUI.ConsoleLog.IPatternLayout">
  6. <conversionPattern value="%log_IP"/>
  7. </layout>
  8. </parameter>
  1. parameterName:我们定义的字段名称

    dbType:默认String

    layout:处理程序的命名空间

    获取客户端IP处理程序:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Text;
  6.  
  7. namespace Electric.WebUI.ConsoleLog
  8. {
  9.  
  10. public class LogMessage
  11. {
  12. public LogMessage()
  13. {
  14. Computer cp = Computer.Instance;
  15. Message = "";
  16. IP = cp.IpAddress;
  17. }
  18. public LogMessage(string message)
  19. : this()
  20. {
  21. Message = message;
  22. }
  23. public string IP { get; set; }
  24.  
  25. public string Message { get; set; }
  26. public override string ToString()
  27. {
  28. return Message.ToString();
  29. }
  30. }
  31. }

获取客户端IP帮助类

  1. using System;
  2. using System.Text;
  3. using System.Management;
  4. using System.Security.Cryptography;
  5. using System.Text.RegularExpressions;
  6. using System.Web;
  7.  
  8. namespace Electric.WebUI.ConsoleLog
  9. {
  10.  
  11. public class Computer
  12. {
  13. public string IpAddress;
  14. private static Computer _instance;
  15. public static Computer Instance
  16. {
  17. get
  18. {
  19. if (_instance == null)
  20. _instance = new Computer();
  21. return _instance;
  22. }
  23. }
  24. protected Computer()
  25. {
  26. IpAddress = IPAddress;
  27. }
  28.  
  29. public string IPAddress
  30. {
  31. get
  32. {
  33. string result = String.Empty;
  34. if (System.Web.HttpContext.Current == null
  35. || System.Web.HttpContext.Current.Request == null
  36. || System.Web.HttpContext.Current.Request.ServerVariables == null)
  37. return string.Empty;
  38. //CDN加速后取到的IP
  39. result = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];
  40. if (!string.IsNullOrEmpty(result))
  41. {
  42. return result;
  43. }
  44.  
  45. result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
  46. if (!string.IsNullOrEmpty(result))
  47. {
  48. //可能有代理
  49. if (result.IndexOf(".") == -1) //没有“.”肯定是非IPv4格式
  50. result = null;
  51. else
  52. {
  53. if (result.IndexOf(",") != -1)
  54. {
  55. //有“,”,估计多个代理。取第一个不是内网的IP。
  56. result = result.Replace(" ", "").Replace("'", "");
  57. string[] temparyip = result.Split(",;".ToCharArray());
  58. for (int i = 0; i < temparyip.Length; i++)
  59. {
  60. if (IsIPAddress(temparyip[i])
  61. && temparyip[i].Substring(0, 3) != "10."
  62. && temparyip[i].Substring(0, 7) != "192.168"
  63. && temparyip[i].Substring(0, 7) != "172.16.")
  64. {
  65. return temparyip[i]; //找到不是内网的地址
  66. }
  67. }
  68. }
  69. else if (IsIPAddress(result)) //代理即是IP格式 ,IsIPAddress判断是否是IP的方法,
  70. return result;
  71. else
  72. result = null; //代理中的内容 非IP,取IP
  73. }
  74.  
  75. }
  76.  
  77. if (string.IsNullOrEmpty(result))
  78. result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
  79.  
  80. if (string.IsNullOrEmpty(result) || string.Compare(result, "unknown", true) == 0)
  81. result = HttpContext.Current.Request.UserHostAddress;
  82.  
  83. if (result.Equals("::1"))
  84. {
  85. return "127.0.0.1";
  86. }
  87. return result;
  88. }
  89. }
  90.  
  91. public bool IsIPAddress(string str)
  92. {
  93. if (string.IsNullOrWhiteSpace(str) || str.Length < 7 || str.Length > 15)
  94. return false;
  95.  
  96. string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}{1}quot;";
  97.  
  98. Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);
  99.  
  100. return regex.IsMatch(str);
  101. }
  102. }
  103.  
  104. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Collections;
  5. using System.IO;
  6.  
  7. using log4net.Core;
  8. //using log4net.Layout.Pattern;
  9. using log4net.Util;
  10. using log4net.Layout;
  11. using log4net.Layout.Pattern;
  12. namespace Electric.WebUI.ConsoleLog
  13. {
  14.  
  15. public class IPatternLayout : log4net.Layout.PatternLayout
  16. {
  17. public IPatternLayout()
  18. {
  19. this.AddConverter("log_IP", typeof(IPPatternConverter));
  20. }
  21. }
  22.  
  23. internal sealed class IPPatternConverter : PatternLayoutConverter
  24. {
  25. override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
  26. {
  27. LogMessage logMessage = loggingEvent.MessageObject as LogMessage;
  28. if (logMessage != null)
  29. writer.Write(logMessage.IP);
  30. }
  31. }
  32. }
  1.  




ASP.NET Log4net数据库日志新增记录客户端ip的更多相关文章

  1. apache 日志中记录代理IP以及真实客户端IP

    vim /usr/local/apach2/conf/httpd.conf 默认情况下log日志格式为:LogFormat "%h %l %u %t \"%r\" %&g ...

  2. nginx反向代理后端web服务器记录客户端ip地址

    nginx在做反向代理的时候,后端的nginx web服务器log中记录的地址都是反向代理服务器的地址,无法查看客户端访问的真实ip. 在反向代理服务器的nginx.conf配置文件中进行配置. lo ...

  3. ABP vNext 审计日志获取真实客户端IP

    背景 在使用ABP vNext时,当需要记录审计日志时,我们按照https://docs.abp.io/zh-Hans/abp/latest/Audit-Logging配置即可开箱即用,然而在实际生产 ...

  4. log4net 自定义日志级别记录多个日志

    程序中原来只记录一个日志,现在我要写一个用户操作日志,需要与原来的日志分开,在config文件中一阵折腾无果(要么写不全,要么写重了,反正没办法完美分离,要么与现存代码没办法完美兼容),差点放弃准备自 ...

  5. asp.net Log4Net错误日志个人总结

    1)创建Global.asax protected void Application_Start(object sender, EventArgs e) { log4net.Config.XmlCon ...

  6. 在ASP.NET Core 2.x中获取客户端IP地址

    一.前言 大家也知道服务端请求时我们获取的IP地址是包含在请求头中,因此这也大大便利了IP的获取. 在ASP.NET中,可以通过以下方式获取客户端的IP地址. HttpContext.Current. ...

  7. DDL和客户端ip监控

    DDL触发器监控脚本部署步骤 以下操作请使用sys用户: --第一步:创建表(此表主要保存ddl触发器产生的信息),可以根据不同的业务,使用相关的监控用户,在此监控用户为c##upctest 从可维护 ...

  8. Log4Net异常日志记录在asp.net mvc3.0的应用

    前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...

  9. Log4Net异常日志记录在asp.net mvc3.0的应用(转载)

    这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...

随机推荐

  1. nginx&http 第三章 惊群

    惊群:概念就不解释了. 直接说正题:惊群问题一般出现在那些web服务器上,Linux系统有个经典的accept惊群问题,这个问题现在已经在内核曾经得以解决,具体来讲就是当有新的连接进入到accept队 ...

  2. EDI在服装行业的应用

    EDI发展迅速,从最初应用于汽车.物流.零售等行业开始,应用范围不断扩大.当下金融行业.服装行业也加入到使用EDI进行数据传输的队伍中.本文主要介绍服装行业通过EDI系统实现业务数据收发,本次EDI项 ...

  3. Angular变更检测策略报错

    报错信息: ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was ...

  4. spring cloud gateway 启动报错,Failed to bind on [0.0.0.0:xxx] bind(..) failed: 权限不够

    最近把操作系统迁移到了deepin,不得不说Linux中需要学习的还是有很多的,本地启动网关的时候就遇到一个坑,特此记录一下,报错信息. Caused by: reactor.netty.Channe ...

  5. mysql 5.7添加server_audit 安全审计功能

    mysql 5.7添加server_audit 安全审计功能 一.根据链接下载插件 参考链接下载  http://blog.itpub.net/31441024/viewspace-2213103 l ...

  6. 支付宝电脑网站支付 alipay.trade.page.pay

    只涉及支付接口 其他接口没有使用 支付宝官方文档:https://docs.open.alipay.com/270/105899/ 支付接口文档 https://docs.open.alipay.co ...

  7. bWAPP----PHP Code Injection

    PHP Code Injection 主要代码 1 <div id="main"> 2 3 <h1>PHP Code Injection</h1> ...

  8. 会声会影使用教程:剪辑Vlogo短视频

    随着抖音.快手等视频分享软件的兴起,很多人已经开始尝试制作短视频分享.那么,对于视频制作新手来说,短视频的制作难度大吗?其实,只要选对了视频制作软件,视频制作将会变得相当简单. 在众多视频制作软件中, ...

  9. 如何使用ABBYY FineReader 识别竖排或反转文本?

    ABBYY FineReader 15(Windows系统)OCR文字识别软件拥有强大的OCR识别功能,能够对这些竖排排版的文档进行准确的识别,另外对于一些具有反转颜色(白色字符和黑暗背景的图像)的文 ...

  10. guitar pro系列教程(十九):Guitar Pro添加音符之前我们要做什么?

    前面的章节我们已经讲了不少关于{cms_selflink page='index' text='Guitar Pro'}的功能之类的讲解,那一般我们在打谱之前要做的是什么呢,很多新手玩家,对这方面也是 ...