1.新建一个空的ASP.Net 空项目,然后添加Default.aspx窗体

2.添加配置文件:log4net.config

 <?xml version="1.0" encoding="utf-8"?>
<configuration> <system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web> <configSections>
<!--添加配置节点-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections> <log4net>
<!--定义输出到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数-->
<!--bufferSize表示批处理的日志事件,可以避免每次日志事件都访问数据库,原本是<bufferSize value="" />一百条才插入-->
<bufferSize value="" />
<!--日志数据库连接串-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="DATABASE=log4netDB;SERVER=DESKTOP-F0T373H\WZH;UID=sa;PWD=18855162320;Connect Timeout=15;" />
<!--日志数据库脚本-->
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[UserID],[UserName],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@UserId,@UserName, @message, @exception)" />
<!--日志时间LogDate -->
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<!--日志类型LogLevel -->
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<!--日志对象LogLogger -->
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<!--自定义UserId -->
<parameter>
<parameterName value="@UserId" />
<dbType value="String" />
<size value="" />
<layout type="log4net保存到数据库中.MyLayout">
<conversionPattern value="%Property{UserID}" />
</layout>
</parameter>
<!--自定义UserName -->
<parameter>
<parameterName value="@UserName" />
<dbType value="String" />
<size value="" />
<layout type="log4net保存到数据库中.MyLayout">
<conversionPattern value="%Property{UserName}" />
</layout>
</parameter>
<!--日志信息Message -->
<!--<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>-->
<!--自定义Message -->
<parameter>
<parameterName value="@Message" />
<dbType value="String" />
<size value="" />
<layout type="log4net保存到数据库中.MyLayout">
<conversionPattern value="%Property{Message}" />
</layout>
</parameter>
<!--异常信息Exception -->
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<root>
<!--配置可输出日志级别-->
<level value="all"/>
<!--应用配置-->
<appender-ref ref="AdoNetAppender"/>
</root>
</log4net> </configuration>

3.在项目中的Properties中AssemblyInfo.cs的末尾添加
  [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

4.添加实体类:LogEntity.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace log4net保存到数据库中
{
public class LogEntity
{
public string UserID { get; set; }
public string UserName { get; set; } public string Message { get; set; }
}
}

5.添加扩展类:MyPatternConverter.cs , MyLayout.cs 来扩展PatternLayout

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net.Layout.Pattern;
using System.Reflection; namespace log4net保存到数据库中
{
public class MyPatternConverter:PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (Option != null)
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
else
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
} //通过反射获取传入的日志对象的某个属性的值
private object LookupProperty(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;
}
}
}

MyPatternConverter.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net.Layout; namespace log4net保存到数据库中
{
public class MyLayout:PatternLayout
{
public MyLayout()
{
this.AddConverter("Property", typeof(MyPatternConverter));
}
}
}

MyLayout.cs

6.添加使用类:LogHelper.cs

 using System;
using System.Diagnostics;
using System.IO; using log4net; namespace log4net保存到数据库中
{
public class LogHelper
{
/// <summary>
/// LoggerName
/// </summary>
public static string LoggerName = string.Empty;
/// <summary>
/// 用户ID
/// </summary>
public static string UserID = string.Empty;
/// <summary>
/// 用户名称
/// </summary>
public static string UserName = string.Empty; private static ILog iLog;
private static LogEntity logEntity; /// <summary>
/// 接口
/// </summary>
private static ILog log
{
get
{ if (iLog == null)
{
iLog = log4net.LogManager.GetLogger(LoggerName);
}
else
{
if (iLog.Logger.Name != LoggerName)
{
iLog = log4net.LogManager.GetLogger(LoggerName);
}
} return iLog;
}
} /// <summary>
/// 构造消息实体
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
private static LogEntity BuildMessageMode(string message)
{
if (logEntity == null)
{
logEntity = new LogEntity();
logEntity.UserID = UserID;
logEntity.UserName = UserName;
logEntity.Message = message;
}
else
logEntity.Message = message; return logEntity;
} /// <summary>
/// 调试
/// </summary>
/// <param name="message">消息</param>
public static void Debug(string message)
{
if (log.IsDebugEnabled)
log.Debug(BuildMessageMode(message));
} /// <summary>
/// 调试
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Debug(string message, Exception ex)
{
if (log.IsDebugEnabled)
log.Debug(BuildMessageMode(message), ex);
} /// <summary>
/// 信息
/// </summary>
/// <param name="message">消息</param>
public static void Info(string message)
{
if (log.IsInfoEnabled)
log.Info(BuildMessageMode(message));
} /// <summary>
/// 信息
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Info(string message, Exception ex)
{
if (log.IsInfoEnabled)
log.Info(BuildMessageMode(message), ex);
} /// <summary>
/// 一般错误
/// </summary>
/// <param name="message">消息</param>
public static void Error(string message)
{
if (log.IsErrorEnabled)
log.Error(BuildMessageMode(message));
} /// <summary>
/// 一般错误
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Error(string message, Exception exception)
{
if (log.IsErrorEnabled)
log.Error(BuildMessageMode(message), exception);
} /// <summary>
/// 警告
/// </summary>
/// <param name="message">消息</param>
public static void Warn(string message)
{
if (log.IsWarnEnabled)
log.Warn(BuildMessageMode(message));
} /// <summary>
/// 警告
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Warn(string message, Exception ex)
{
if (log.IsWarnEnabled)
log.Warn(BuildMessageMode(message), ex);
} /// <summary>
/// 严重
/// </summary>
/// <param name="message">消息</param>
public static void Fatal(string message)
{
if (log.IsFatalEnabled)
log.Fatal(BuildMessageMode(message));
} /// <summary>
/// 严重
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Fatal(string message, Exception ex)
{
if (log.IsFatalEnabled)
log.Fatal(BuildMessageMode(message), ex);
}
}
}

LogHelper.cs

7.在Default.aspx.cs中使用:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net; namespace log4net保存到数据库中
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
LogHelper.LoggerName = typeof(Default).ToString();
LogHelper.UserID = "";
LogHelper.UserName = "me";
int i = ;
try
{ int b = / i;
}
catch (Exception ex)
{
LogHelper.Error(ex.Message, ex);
}
LogHelper.Fatal("Fatal",new Exception("异常信息"));
LogHelper.Info("Info");
LogHelper.Warn("Warn");
LogHelper.Debug("Debug");
}
}
}

Default.aspx.cs

8.配置数据库SQL Server2012:创建数据库log4netDB

 CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (, ) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] () NOT NULL,
[Level] [varchar] () NOT NULL,
[Logger] [varchar] () NOT NULL,
[UserID] [varchar] () NOT NULL,
[UserName] [varchar] () NOT NULL,
[Message] [varchar] () NOT NULL,
[Exception] [varchar] () NULL
)

sql语句

9.运行

10.帮助文档:

http://www.cnblogs.com/izreo/p/5651139.html

http://www.cnblogs.com/jiajinyi/p/5884930.html

Log4net 数据库存储(四)的更多相关文章

  1. log4net保存到数据库系列四、完整代码配置log4net

    园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志一.WebConfig中配置log4net 一.WebConfig中配置log4ne ...

  2. Python3编写网络爬虫11-数据存储方式四-关系型数据库存储

    关系型数据库存储 关系型数据库是基于关系模型的数据库,而关系模型是通过二维表保存的,所以它的存储方式就是行列组成的表.每一列是一个字段,每一行是一条记录.表可以看作某个实体的集合,而实体之间存在联系, ...

  3. DDD开发框架ABP之本地化资源的数据库存储扩展

    在上一篇<DDD开发框架ABP之本地化/多语言支持>中,我们知道,ABP开发框架中本地化资源存储可以采用XML文件,RESX资源文件,也提供了其他自定义的存储方式的扩展接口.ABP框架默认 ...

  4. RAID在数据库存储上的应用-转

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  5. 1. RAID在数据库存储上的应用

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  6. 更改Mysql数据库存储位置的具体步骤

    首先把mysql的服务先停掉,更改MySQL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件和文件夹复制到新的存储主路径,接下来重启搞定     一.首先把mysql的服 ...

  7. Log4NET 数据库

    阅读目录 Log4NET简介 前提 详细步骤 回到顶部 Log4NET简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种 ...

  8. <Android基础> (六) 数据存储 Part 3 SQLite数据库存储

    6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...

  9. 一个Web项目中实现多个数据库存储数据并相互切换用过吗?

    最近公司一个项目需要连接多个数据库(A和B)操作,根据不同的业务模块查询不同的数据库,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,项目后 ...

随机推荐

  1. 洛谷 P1411 树 (树形dp)

    大意: 给定树, 求删除一些边, 使得连通块大小的乘积最大 设$dp_{i,j}$表示只考虑点$i$的子树, $i$所在连通块大小为$j$的最大值. 转移的时候不计算$i$所在连通块的贡献, 留到最后 ...

  2. Scala 系列(七)—— 常用集合类型之 Map & Tuple

    一.映射(Map) 1.1 构造Map // 初始化一个空 map val scores01 = new HashMap[String, Int] // 从指定的值初始化 Map(方式一) val s ...

  3. Jquery+CSS实现遮罩效果

    JavaScript: (function ($) { $.fn.ShowMask = function (options) { var defaults = { top: 150, left: 20 ...

  4. Linux的巡检命令

    # uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostname ...

  5. jquery实现弹出层完美居中效果

    代码如下: showDiv($("#pop"));function showDiv(obj){ $(obj).show(); center(obj); $(window).scro ...

  6. Hybris服务器启动日志分析

    build文件检测,使用b2c_acc recipit启动服务器:/home/jerrywang/Hybris/installer/recipes/b2c_acc/build.gradle The T ...

  7. java程序员常用的cmd命令

    1.查看端口号或者进程号使用情况 1.1.查看所有端口占用情况 C:\Users\Administrator>netstat -ano 活动连接 协议 本地地址 (ip:端口) 外部地址 状态 ...

  8. WebApi中将静态页面作为首页

    WebApi中将静态页面作为首页 使用场景 在我的项目中使用Asp.Net WebApi作为后端数据服务,使用Vue作为前端Web,在服务器IIS上部署时需要占用两个端口,一个是80端口,用户在浏览器 ...

  9. 如何寻找sql注入漏洞?

    1.sql注入是怎么产生的 2.如何寻找sql注入漏洞 在地址栏输入单双引号造成sql执行异常(get) post请求,在标题后输入单引号,造成sql执行异常.

  10. python——selenium库的使用

    selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fire ...