LOG4数据库记录器XML配置

 1     <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
2 <!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
3 <bufferSize value="1"/>
4 <Threshold value="Error" />
5 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
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 <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 <parameter>
9 <parameterName value="@log_date"/>
10 <dbType value="DateTime"/>
11 <layout type="log4net.Layout.RawTimeStampLayout"/>
12 </parameter>
13 <parameter>
14 <parameterName value="@log_thread"/>
15 <dbType value="String"/>
16 <size value="255"/>
17 <layout type="log4net.Layout.PatternLayout">
18 <conversionPattern value="%thread"/>
19 </layout>
20 </parameter>
21 <parameter>
22 <parameterName value="@log_level"/>
23 <dbType value="String"/>
24 <size value="50"/>
25 <layout type="log4net.Layout.PatternLayout">
26 <conversionPattern value="%level"/>
27 </layout>
28 </parameter>
29 <parameter>
30 <parameterName value="@log_logger"/>
31 <dbType value="String"/>
32 <size value="255"/>
33 <layout type="log4net.Layout.PatternLayout">
34 <conversionPattern value="%logger"/>
35 </layout>
36 </parameter>
37 <parameter>
38 <parameterName value="@log_message"/>
39 <dbType value="String"/>
40 <size value="4000"/>
41 <layout type="log4net.Layout.PatternLayout">
42 <conversionPattern value="%message"/>
43 </layout>
44 </parameter>
45 <parameter>
46 <parameterName value="@log_exception"/>
47 <dbType value="String"/>
48 <size value="2000"/>
49 <layout type="log4net.Layout.ExceptionLayout"/>
50 </parameter>
51 <parameter>
52 <parameterName value="@log_ip"/>
53 <dbType value="String"/>
54 <size value="50"/>
55 <layout type="Electric.WebUI.ConsoleLog.IPatternLayout">
56 <conversionPattern value="%log_IP"/>
57 </layout>
58 </parameter>
59
60 </appender>
@log_ip为客户端IP字段名称,名字可以自己取,INSERT语句顺序匹配上就行

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

dbType:默认String

layout:处理程序的命名空间

获取客户端IP处理程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text; namespace Electric.WebUI.ConsoleLog
{ public class LogMessage
{
public LogMessage()
{
Computer cp = Computer.Instance;
Message = "";
IP = cp.IpAddress;
}
public LogMessage(string message)
: this()
{
Message = message;
}
public string IP { get; set; } public string Message { get; set; }
public override string ToString()
{
return Message.ToString();
}
}
}

获取客户端IP帮助类

using System;
using System.Text;
using System.Management;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Web; namespace Electric.WebUI.ConsoleLog
{ public class Computer
{
public string IpAddress;
private static Computer _instance;
public static Computer Instance
{
get
{
if (_instance == null)
_instance = new Computer();
return _instance;
}
}
protected Computer()
{
IpAddress = IPAddress;
} public string IPAddress
{
get
{
string result = String.Empty;
if (System.Web.HttpContext.Current == null
|| System.Web.HttpContext.Current.Request == null
|| System.Web.HttpContext.Current.Request.ServerVariables == null)
return string.Empty;
//CDN加速后取到的IP
result = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];
if (!string.IsNullOrEmpty(result))
{
return result;
} result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(result))
{
//可能有代理
if (result.IndexOf(".") == -1) //没有“.”肯定是非IPv4格式
result = null;
else
{
if (result.IndexOf(",") != -1)
{
//有“,”,估计多个代理。取第一个不是内网的IP。
result = result.Replace(" ", "").Replace("'", "");
string[] temparyip = result.Split(",;".ToCharArray());
for (int i = 0; i < temparyip.Length; i++)
{
if (IsIPAddress(temparyip[i])
&& temparyip[i].Substring(0, 3) != "10."
&& temparyip[i].Substring(0, 7) != "192.168"
&& temparyip[i].Substring(0, 7) != "172.16.")
{
return temparyip[i]; //找到不是内网的地址
}
}
}
else if (IsIPAddress(result)) //代理即是IP格式 ,IsIPAddress判断是否是IP的方法,
return result;
else
result = null; //代理中的内容 非IP,取IP
} } if (string.IsNullOrEmpty(result))
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; if (string.IsNullOrEmpty(result) || string.Compare(result, "unknown", true) == 0)
result = HttpContext.Current.Request.UserHostAddress; if (result.Equals("::1"))
{
return "127.0.0.1";
}
return result;
}
} public bool IsIPAddress(string str)
{
if (string.IsNullOrWhiteSpace(str) || str.Length < 7 || str.Length > 15)
return false; string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}{1}quot;"; Regex regex = new Regex(regformat, RegexOptions.IgnoreCase); return regex.IsMatch(str);
}
} }
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO; using log4net.Core;
//using log4net.Layout.Pattern;
using log4net.Util;
using log4net.Layout;
using log4net.Layout.Pattern;
namespace Electric.WebUI.ConsoleLog
{ public class IPatternLayout : log4net.Layout.PatternLayout
{
public IPatternLayout()
{
this.AddConverter("log_IP", typeof(IPPatternConverter));
}
} internal sealed class IPPatternConverter : PatternLayoutConverter
{
override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
LogMessage logMessage = loggingEvent.MessageObject as LogMessage;
if (logMessage != null)
writer.Write(logMessage.IP);
}
}
}
 




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. Flutter(75):Sliver组件之SliverFixedExtentList

    Flutter教学目录持续更新中 Github源代码持续更新中 1.SliverFixedExtentList 可以固定Item高度的SliverList 2.SliverFixedExtentLis ...

  2. Java 内功修炼 之 数据结构与算法(二)

    一.二叉树补充.多叉树 1.二叉树(非递归实现遍历) (1)前提 前面一篇介绍了 二叉树.顺序二叉树.线索二叉树.哈夫曼树等树结构. 可参考:https://www.cnblogs.com/l-y-h ...

  3. Kubernetes+Promethues+Cloud Alert实践分享

    前言 容器集群管理系统 Kubernetes(简称K8s),为容器化的应用提供部署运行.容器编排.负载均衡.服务发现和动态伸缩等一系列完整功能,Prometheus 对 K8s 支持非常棒,能够自动发 ...

  4. tcpack--3快速确认模式

    接收到数据报后,会调用tcp_event_data_recv(),不管是在慢速路径的tcp_data_queue中调用还是 在快速路径中处理接收数据后直接调用,注意(如果len <= tcp_h ...

  5. 如何删除一台OSD主机

    在ceph的一台OSD主机出现故障的时候,数据可以通过副本的机制进行恢复,之后通过删除osd的操作也能够将故障osd从osd tree当中删除掉,但是故障的 osd 的主机仍然会留在集群当中,通过 c ...

  6. Spring源码理论

    Spring Bean的创建过程: Spring容器获取Bean和创建Bean都会调用getBean()方法. getBean()方法 1)getBean()方法内部最终调用doGetBean()方法 ...

  7. 环境安装和pycharm中一些基本设置

    一.Pycharm的使用和Python环境 1.python和pycharm的安装 python推荐版本3.7/3.8 pycharm选择社区版本 查看python版本在cmd中输入"pyt ...

  8. Oracle数据泵的导入和导出

    前言 今天王子要分享的内容是关于Oracle的一个实战内容,Oracle的数据泵. 网上有很多关于此的内容,但很多都是复制粘贴别人的,导致很多小伙伴想要使用的时候不能直接上手,所以这篇文章一定能让你更 ...

  9. 面试必看!靠着这份字节和腾讯的面经,我成功拿下了offer!

    准备 敲定了方向和目标后就开始系统准备,主要分为以下几个方面来准备. 算法题 事先已经看过别人的社招面经知道头条每轮技术面都有算法题,而这一块平时练习的比较少,校招时刷的题也忘记了很多.因此系统复习的 ...

  10. Cypress系列(93)- Cypress.dom 命令详解

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 与 DOM 元素相关的 helpe ...