首先申明,本示例经过本作者亲自试验通过,可以运行

第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections> <!--日志模块配置-->
<log4net>
<root>
<!--Highest: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL :Lowest -->
<level value="ALL"></level>
</root>
<logger name="InfoLogger">
<level value="INFO"/>
<appender-ref ref="ADONetAppender" />
</logger> <!--访问日志记录形式-->
<appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
<param name="bufferSize" value="" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="server=....;database=.....;user id =sa;password=...."/>
<param name="commandText" value="INSERT INTO T_ACCESS_LOG ([PUBLIC_KEY],[INTERFACE],[IP]) VALUES (@PUBLIC_KEY,@INTERFACE,@IP)" />
   <!--用存储过程的话是下面这种写法-->
<!--<param name="CommandType" value="StoredProcedure" />
      <param name="commandText" value="SP_T_ACCESS_LOG" />--> <parameter>
<parameterName value="@PUBLIC_KEY" />
<dbType value="String" />
<size value="" />
     <!--这里的Utilities是程序里的命名空间-->
<layout type="Utilities.CustomLayout,Utilities">
<conversionPattern value="%property{PublicKey}" />
</layout>
</parameter>
<parameter>
<parameterName value="@INTERFACE" />
<dbType value="String" />
<size value="" />
<layout type="Utilities.CustomLayout,Utilities">
<conversionPattern value="%property{Interface}" />
</layout>
</parameter>
<parameter>
<parameterName value="@IP" />
<dbType value="String" />
<size value="" />
<layout type="Utilities.CustomLayout,Utilities">
<conversionPattern value="%property{IP}" />
</layout>
</parameter>
</appender>
</log4net>
</configuration>

第二步 加载log4net配置文件,即这个Log.xml,一共有两个位置需要改动

第一个位置 Web应用程序下的AssemblyInfo.cs,加上一句代码

[assembly: log4net.Config.DOMConfigurator(ConfigFile = "Log.xml", Watch = true)]

第二个位置 Global.asax

//在应用程序启动时运行的代码
log4net.Config.XmlConfigurator.Configure();

第三步 编写想要插入到数据库的实体类LogMessage.cs,本示例实体类中的所有字段均为自定义字段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Utilities
{
public class LogMessage
{
public LogMessage() { } public LogMessage(string publicKey,string interFace, string Ip)
{
this._publickey = publicKey;
this._interface = interFace;
this._ip = Ip;
} private string _publickey;
public string PublicKey
{
get { return _publickey; }
set { _publickey = value; }
} private string _interface;
public string Interface
{
get { return _interface; }
set { _interface = value; }
} private string _ip;
public string IP
{
get { return _ip; }
set { _ip = value; }
} } }

第四步 编写最关键也是最核心的两个类CustomPatternConverter.cs,CustomLayout.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using log4net.Layout.Pattern;
using System.Reflection; namespace Utilities
{
public class CustomPatternConverter:PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (Option != null)
{
WriteObject(writer, loggingEvent.Repository, GetPropertyValue(Option, loggingEvent));
}
else
{
// Write all the key value pairs
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
}
} /// <summary>
/// 通过反射获取传入的日志对象的某个属性的值
/// </summary>
/// <param name="property"></param>
/// <returns></returns>
private object GetPropertyValue(string property, log4net.Core.LoggingEvent loggingEvent)
{
object propertyValue = string.Empty;
PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
if (propertyInfo != null)
{
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
}
return propertyValue;
} }
}
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using log4net.Layout;
using log4net.Layout.Pattern;
using log4net.Util;
using log4net.Core; namespace Utilities
{
public class CustomLayout : PatternLayout
{
public CustomLayout()
{
this.AddConverter("property", typeof(CustomPatternConverter));
}
}
}

第五步 调用log4net,此处我分为了一个工具类和实际调用的例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Diagnostics;
using log4net; namespace Utilities
{
public static class LogHelper
{
private static ILog InfoLogger = log4net.LogManager.GetLogger("InfoLogger"); public static void WriteInfo(LogMessage log)
{
if (InfoLogger.IsInfoEnabled)
{
InfoLogger.Info(log);
}
}
}
}
LogMessage mylog = new LogMessage();
mylog.PublicKey = "admin";
mylog.Interface = "DY/QueryNewsList";
mylog.IP = “127.0.0.1”;
LogHelper.WriteInfo(mylog);

至此,整个流程就走通了,当然,很多时候,照着别人的示例来也经常会出现这样或那样的问题,这可怎么办呢?没关系,这个log4net是可以调试的,没错,它可以输出调试信息

启动log4net的内部调试,具体作法如下:

在Web.config中加入下列节点

  <appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings> <system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="D:\log\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>

然后,每跑完一次,你就可以去D:\log\log4net.txt文件里查看调试信息,分析下那些Error打头的条目,你就知道你错在哪儿了

最后转载的同学们,记得标明一下出处~

log4net自定义字段写入SqlServer数据库 ASP.net的更多相关文章

  1. Log4net 自定义字段 写入Oracle 使用ODP.NET Managed驱动

    一.环境说明: 开发工具:vs2010   ,数据库:oracle 11g ,版本:log4net的目前最新版本1.2.13.0    :  Oracle.ManagedDataAccess.dll ...

  2. Log4net 自定义字段到数据库

    今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value=&q ...

  3. NLog自定义字段写入数据库表,示例

    //自定义字段写入NLog日志 private void saveNLog(InvokeLogModel model) { LogEventInfo ei = new LogEventInfo(); ...

  4. Log4net 自定义字段到数据库(二)

    这种方法比第一种方法麻烦些 Log4Net.config <?xml version="1.0" encoding="utf-8" ?> <c ...

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

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

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

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

  7. NLog 自定义字段 写入 oracle

    1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码 2.建表语句 create table TBL_LOG ( id ) not null, appname ...

  8. [转]NLog 自定义字段 写入 oracle

    本文转自:http://www.cnblogs.com/skyapplezhao/p/5690695.html 1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴 ...

  9. Silverlight将Excel导入到SQLserver数据库

    最近纠结于读取Excel模板数据,将数据导入SQLServer的Silverlight实现,本文将实现代码贴出,作为一个简单的例子,方便各位: 1.先设计前台界面新建Silverlight5.0应用程 ...

随机推荐

  1. 2014 年10个最佳的PHP图像操作库--留着有用

    Thomas Boutell 以及众多的开发者创造了以GD图形库闻名的一个图形软件库,用于动态的图形计算. GD提供了对于诸如C, Perl, Python, PHP, OCaml等等诸多编程语言的支 ...

  2. Android 百度地图定位(手动+自动) 安卓开发教程

    近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置.  经过2天研究 ...

  3. TP复习3

    ## ThinkPHP 3.1.2 CURD特性#讲师:赵桐正微博:http://weibo.com/zhaotongzheng 本节课大纲: 一.ThinkPHP 3 的CURD介绍 (了解) 二. ...

  4. Topcomponent --sighoff

    Topcomponent --sighoff 实现一个置于右边框的Topcomponent: 1.可远程同步更新(根据远程的xml文件),修改(增删)该xml文件,查看.刷新等 2.打包工程,记录该打 ...

  5. vm.dirty_ratio & vm.dirty_background_ratio

    https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/ Better Lin ...

  6. MYSQL: Handler_read_%参数说明

      环境: 表t_feed_idx(user_id bigint, feed_id bigint, KEY (`user_id`,`feed_id`)) engine=innodb;表t_feed_i ...

  7. 疑难杂症:org.hibernate.MappingException: Unknown entity,annotation配置Entity类报错

    引言: 夜声人静,外面下着稀里哗啦的雨,周末的晚上,还在键盘上舞动手指. 此刻很感激一个人一篇随笔,感谢xiaochao以及他的<org.hibernate.MappingException: ...

  8. SignalR的简单实现

    1创建mvc的空项目 2添加文件夹Counters放在里面的类用于封装性能计数器 3创建PerfCounterWrapper类用于封装性能计数器的实体 using System; using Syst ...

  9. Java再学习——线程之创建

    Java创建线程有两种方法,一种是继承Thread,另一种实现Runnable或Callable接口. 一,继承Thread public class APP { public static void ...

  10. iOS缓存框架-PINCache解读

    文/Amin706(简书作者)原文链接:http://www.jianshu.com/p/4df5aad0cbd4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在项目中总是需要缓存一 ...