Log4Net使用指南之用log4net记录日志到数据库(含有自定义属性)------附Demo例子源代码
Log4NET简介
log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
前提
最近做项目需要记录系统日志和用户操作日志,就想起来了log4net,但是业务需要需要加入自定义属性,并把自定义属性日志数据插入到数据库中,看好趁这个机会学习总结下。
详细步骤
一、首先下载:log4net.dll 下载地址:http://logging.apache.org/log4net/download_log4net.cgi
二、在项目中进行引用。这个不多说了,相信大家都很熟悉这个过程。
三、在web.config,加入以下代码:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
四、然后在与web.config同目录下面新建个配置文件,我这建了个log4net.config,如下图

五、在log4net.config加入以下代码,里面注释和详细 ,大家可以看如下代码:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections> <log4net>
<logger name="myLogger">
<level value="INFO"/>
<appender-ref ref="AdoNetAppender_SqlServer"/>
<!--sql server数据库1-->
<appender-ref ref="AdoNetAppender_SqlServer1"/>
<!--sql server数据库2-->
<appender-ref ref="AdoNetAppender_Sqllite"/>
<!--sqlite数据库-->
<appender-ref ref="InfoAppender"/>
<!--记录到文件-->
</logger> <!--sql server数据库1-->
<appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
<!-- BufferSize 为缓冲区大小,只有日志记录超5 条才会一块写入到数据库 -->
<!-- 或写为<param name="BufferSize" value="" /> -->
<bufferSize value=""/>
<!-- 引用 -->
<!--.0这是对应sql2008 如是2000或2005另外配置-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/> <!-- 连接数据库字符串 -->
<connectionString value="Data Source=.;Initial Catalog=Log;User ID=sa;Password=sa123;" />
<!-- 插入到表Log -->
<commandText value = "INSERT INTO Mylogger ([EVENTTYPE],[TIMESTAMP],[EVENTCATEGORY],[EVENT_ID],[COMPUTERNAME],[MAC_ADDRESS],[USERNAME],[SOURCETYPE],[SOURCE],[DESCRIPTION],[COLLECTDATE]) VALUES (@Event_Type,@log_date, @EventCategory, @Event_ID, @ComputerName,@Mac_Address,@UserName,@SourceType,@Source,@Description,@CollectDate) "/> <!-- 日志类型,这里均为3 -->
<parameter>
<parameterName value = "@Event_Type"/>
<dbType value = "Int32"/>
<!--<dbType value = "String"/>
<size value = ""/>-->
<!-- LogComponent 是类所在的命名空间,MyLayout 是自定义属性所在的类,这是我们自己要写的部分,将在下面介绍。 -->
<layout type = "Log4netExpand.MyLayout,log4nettest">
<!-- 当用到property 时,就表明这是用户自定义的字段属性啦,是log4net 中所没有提供的字段。 -->
<conversionPattern value = "%property{Event_Type} "/>
</layout>
</parameter> <!-- 日志记录时间,RawTimeStampLayout 为默认的时间输出格式 -->
<parameter>
<parameterName value = "@log_date"/>
<dbType value = "DateTime"/>
<layout type = "log4net.Layout.RawTimeStampLayout"/>
<!-- /这里呢是获取log4net 中提供的日志时间 -->
</parameter> <!-- 日志分类描述 -->
<parameter>
<parameterName value = "@EventCategory"/>
<dbType value = "String"/>
<size value = ""/>
<layout type = "Log4netExpand.MyLayout,log4nettest">
<conversionPattern value = "%property{EventCategory}"/>
</layout>
</parameter> <!-- 日志分类号 -->
<parameter>
<parameterName value = "@Event_ID"/>
<dbType value = "Int32"/>
<layout type = "Log4netExpand.MyLayout,log4nettest">
<conversionPattern value = "%property{Event_ID}"/>
</layout>
</parameter> <!-- 计算机IP -->
<parameter>
<parameterName value = "@ComputerName"/>
<dbType value = "String"/>
<size value = ""/>
<layout type = "Log4netExpand.MyLayout,log4nettest">
<conversionPattern value = "%property{ComputerName}"/>
</layout>
</parameter> <!-- 计算机Mac 信息 -->
<parameter>
<parameterName value = "@Mac_Address"/>
<dbType value = "String"/>
<size value = "50 "/>
<layout type = "Log4netExpand.MyLayout, log4nettest">
<conversionPattern value = "%property{Mac_Address}"/>
</layout>
</parameter> <!-- 登陆系统用户名 -->
<parameter>
<parameterName value = "@UserName"/>
<dbType value = "String"/>
<size value = ""/>
<layout type = "Log4netExpand.MyLayout,log4nettest">
<conversionPattern value = "%property{UserName}"/>
</layout>
</parameter> <!-- 事件来源类型,这里默认为Rier -->
<parameter>
<parameterName value = "@SourceType"/>
<dbType value = "String"/>
<size value = ""/>
<layout type = "Log4netExpand.MyLayout,log4nettest">
<conversionPattern value = "%property{SourceType}"/>
</layout>
</parameter> <!-- 事件来源 -->
<parameter>
<parameterName value = "@Source "/>
<dbType value = "String"/>
<size value = ""/>
<layout type = "Log4netExpand.MyLayout,log4nettest">
<conversionPattern value = "%property{Source}"/>
</layout>
</parameter> <!-- 事件描述 -->
<parameter>
<parameterName value = "@Description "/>
<dbType value = "String"/>
<size value = ""/>
<layout type = "Log4netExpand.MyLayout, log4nettest">
<conversionPattern value = "%property{Description}"/>
</layout>
</parameter> <!-- 日志收集时间 -->
<parameter>
<parameterName value = "@CollectDate"/>
<dbType value = "DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
</appender> <!--记录到文件-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <param name="File" value="Log\\INFO\\"/>
<param name="AppendToFile" value="true"/>
<param name="MaxFileSize" value="" />
<param name="MaxSizeRollBackups" value=""/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyyMMdd".txt""/>
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<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" />
</layout>
</appender> <!--sql server数据库2-->
<appender name="AdoNetAppender_SqlServer1" type="log4net.Appender.AdoNetAppender">
<bufferSize value=""/>
<!--.0这是对应sql2008 如是2000或2005另外配置-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/> <!-- 连接数据库字符串 -->
<connectionString value="Data Source=.;Initial Catalog=Log;User ID=sa;Password=sa123;" /> <!-- 插入到表Log -->
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message,@exception)"/> <parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
</layout>
<!-- <layout type="log4net.Layout.RawTimeStampLayout"/>-->
</parameter>
<parameter>
<parameterName value="@thread"/>
<dbType value="String"/>
<size value=""/>
<!-- LogComponent 是类所在的命名空间,MyLayout 是自定义属性所在的类,这是我们自己要写的部分,将在下面介绍。 -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@log_level"/>
<dbType value="String"/>
<size value=""/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter>
<parameter>
<parameterName value="@logger"/>
<dbType value="String"/>
<size value=""/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger"/>
</layout>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value=""/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> <!--sqlite数据库-->
<appender name="AdoNetAppender_Sqllite" type="log4net.Appender.AdoNetAppender">
<bufferSize value=""/>
<!--.0这是对应sql2008 如是2000或2005另外配置-->
<!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>-->
<connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
<!-- 连接数据库字符串 -->
<!--<connectionString value="Data Source=.;Initial Catalog=Log;User ID=sa;Password=123;" />-->
<connectionString value="C:\\Users\\Administrator\\Desktop\\log4net\\Log4netExpand\\Test.db3;" />
<!-- 插入到表Log -->
<commandText value="INSERT INTO MAIN.[Log] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message,@exception)"/> <parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
</layout>
<!-- <layout type="log4net.Layout.RawTimeStampLayout"/>-->
</parameter>
<parameter>
<parameterName value="@thread"/>
<dbType value="String"/>
<!--<size value=""/>-->
<!-- LogComponent 是类所在的命名空间,MyLayout 是自定义属性所在的类,这是我们自己要写的部分,将在下面介绍。 -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@log_level"/>
<dbType value="String"/>
<!--<size value=""/>-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter>
<parameter>
<parameterName value="@logger"/>
<dbType value="String"/>
<!--<size value=""/>-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger"/>
</layout>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<!--<size value=""/>-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<!--<size value="" />-->
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
</log4net> <system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web> </configuration>
我主要说下里面自定义属性的代码的分别代表意义:
<parameter>
96 <parameterName value = "@UserName"/>
97 <dbType value = "String"/>
98 <size value = "50"/>
99 <layout type = "Log4netExpand.MyLayout,log4nettest">
100 <conversionPattern value = "%property{UserName}"/>
101 </layout>
102 </parameter>
其中MyLayout,是我们自己定义的类,下面有介绍;Log4netExpand是这个类的命名空间;log4nettest这个代表是aspx页面的命名空间。注意在此区分。
六、自定义类,这些类呢包含将要插入数据库中的自定义字段
命名空间为 Log4netExpand包含3个类:LogContent.cs、 MyLayout.cs 、MyMessagePatternConverter .cs
1)第一个LogContent类如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Log4netExpand
{
/// <summary>
/// 包含了所有的自定字段属性
/// </summary>
public class LogContent
{
/// <summary>
/// 时间类型 均为3
/// </summary>
public int Event_Type { get; set; } /// <summary>
/// 日志分类描述,自定义
/// </summary>
public string EventCategory { get; set; } /// <summary>
/// 日志分类号
/// </summary>
public int Event_ID { get; set; } /// <summary>
/// 计算机IP
/// </summary>
public string ComputerName { get; set; } /// <summary>
/// 计算机Mac 地址
/// </summary>
public string Mac_Address { get; set; } /// <summary>
/// 系统登陆用户
/// </summary>
public string UserName { get; set; } /// <summary>
/// Rier
/// </summary>
public string SourceType { get; set; } /// <summary>
/// Rier Recorder audit
/// </summary>
public string Source { get; set; } /// <summary>
/// 日志描述信息
/// </summary>
public string Description { get; set; } }
}
2)第二个类MyLayout代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net.Layout; namespace Log4netExpand
{
class MyLayout : PatternLayout
{
public MyLayout()
{
this.AddConverter("property", typeof(MyMessagePatternConverter));
}
}
}
3)第三个类MyMessagePatternConverter 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Reflection;
using log4net.Layout.Pattern; namespace Log4netExpand
{
public class MyMessagePatternConverter : PatternLayoutConverter
{ protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{ if (Option != null)
{ // Write the value for the specified key WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent)); } else
{ // Write all the key value pairs WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties()); } //if (Option != null) //{ // // Write the value for the specified key // WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty(Option)); //} //else //{ // // Write all the key value pairs // WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties()); //} } /// <summary> /// 通过反射获取传入的日志对象的某个属性的值 /// </summary> /// <param name="property"></param> /// <returns></returns> 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; } }
}
七、代码页,实现通过log4net把日志(含自定一生属性)添加到数据库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; using System.Management;
using Log4netExpand; namespace Log4netExpand
{
public partial class test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button1_Click(object sender, EventArgs e)
{
log4net.ILog log = log4net.LogManager.GetLogger("myLogger"); LogContent logmodel = new LogContent();
logmodel.Event_Type = ;
logmodel.EventCategory = "登陆系统";
logmodel.Event_ID = ;
logmodel.ComputerName = Request.UserHostAddress;
logmodel.Mac_Address = GetMacAddress();
logmodel.Source = "SS";
logmodel.SourceType = "";
logmodel.UserName = "ADMIN";
logmodel.Description = "TEST";//在记录数据库操作时,可以在petapoco底层将sql语句放入其中。
LogHelper.WriteLog(logmodel); lbMsg.Text = "数据记录成功!";
} public string GetMacAddress()
{
string mac = "";
try
{
//获取网卡硬件地址
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
{
mac = mo["MacAddress"].ToString(); list.Add(mac);
}
}
moc = null;
mc = null; mac = list[list.Count - ]; return mac;
}
catch
{
return "unknow";
}
}
}
}
代码例子源代码: Demo下载
Log4Net使用指南之用log4net记录日志到数据库(含有自定义属性)------附Demo例子源代码的更多相关文章
- Log4Net(三)之记录日志到数据库
前面两篇短文向大家介绍了如何使用log4net,以及如何将log4net记录到文本文件中.下面本文将向大家介绍如何将log4net记录到数据库中. 经过前面的介绍,我想大家对使用log4net的过程已 ...
- 将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库
最近做了一个sharePoint项目,需要实现的功能是,第三方网站访问我们sharePoint中的数据,通过Webservice方式实现文件的上传和下载. 于是代码工作完成了之后,本地调试没什么问题, ...
- 使用log4net记录日志到数据库(含有自定义属性)
记录日志是管理系统中对用户行为的一种监控与审核,asp.net中记录日志的方式有很多种,这里我只介绍一下最近用到的log4net,关于他的具体介绍网上有很多,我讲一下他的用法. 第一步:在配置文件中的 ...
- log4net菜鸟指南
log4net的作用 提供一个记录日志的框架,可以将日志信息记录到文件(txt.xml等).控制台.Windows事件日志和数据库(MSSQL.Acess.Oracle.DB2和SQLite等). 要 ...
- Asp.Net Core Log4Net 配置分多个文件记录日志(不同日志级别)
本文所有配置都是在core3.1环境下. 首先看看最终的效果. 请求监控:对每次请求的相关信息做一个记录. 全局异常:我不想我的错误信息,跟其他的信息混合在一起,查看的时候不大方便. 应用日志:这个主 ...
- Log4net使用指南
请在这里下载示例代码 1 简介 1.1 Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的 ...
- [转]log4net 使用指南
声明:本文内容主要译自Nauman Leghari的Using log4net,亦加入了个人的一点心得(节3.1.4). 请在这里下载示例代码 1 简介 1.1 ...
- Log4Net使用指南(转)
转自:http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html 声明:本文内容主要译自Nauman Leghari的Using log4 ...
- C# Log4Net使用指南(转)
1 简介 1.1 Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管 ...
随机推荐
- php请求API接口方法
thinkphp下直接放入公共函数即可. /** * 通过URL获取页面信息 * @param string $url 地址 * @return string 返回页面信息 */ function g ...
- Kafka学习之路 (五)Kafka在zookeeper中的存储
一.Kafka在zookeeper中存储结构图 二.分析 2.1 topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 [zk: ...
- 关于Spring IOC (DI-依赖注入)需要知道的一切
关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...
- 数据同步canal服务端介绍
1.下载安装包 canal&github的地址,最权威的学习canal相关知识的地方 https://github.com/alibaba/canal 在下面的wiki列表中找到AdminGu ...
- WorldWind源码剖析系列:配置载入器类ConfigurationLoader
配置载入器类ConfigurationLoader主要从指定的路径中加载保存星球相关参数的xml文件,从中读取数据来构造星球对象及其所关联的可渲染子对象列表并返回.该类的类图如下所示. 该类所包含的主 ...
- 二,ESP8266 GPIO和SPI和定时器和串口(基于Lua脚本语言)
https://www.cnblogs.com/yangfengwu/p/7514336.html 我们写lua用这个软件 如果点击的时候提示安装,,安装就行,,如果没有提示呢可以,按照下面链接的提示 ...
- 大数据入门第十五天——HBase整合:云笔记项目
一.功能简述 1.笔记本管理(增删改) 2.笔记管理 3.共享笔记查询功能 4.回收站 效果预览: 二.库表设计 1.设计理念 将云笔记信息分别存储在redis和hbase中. redis(缓存):存 ...
- 20155232《网络对抗》Exp 6 信息搜集与漏洞扫描
20155232<网络对抗>Exp 6 信息搜集与漏洞扫描 一.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版 ...
- 20155235 《网络攻防》 实验八 Web基础
20155235 <网络攻防> 实验八 Web基础 实验内容 Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表 ...
- 洛咕 P3756 [CQOI2017]老C的方块
四染色,贼好想 一个弃疗图形刚好对应一个红-绿-黄-粉色路线(不要吐槽颜色) 就是裸的最小割,建图傻逼懒得写了 #include<bits/stdc++.h> #define il inl ...