C# 利用log4net 把日志写入到数据库表中
效果图:
1:第一步创建SQL表结构
- CREATE TABLE [dbo].[LogDetails] (
 - [LogID] int NOT NULL IDENTITY(1,1) ,
 - [LogDate] datetime NOT NULL ,
 - [LogThread] nvarchar(100) NOT NULL ,
 - [LogLevel] nvarchar(200) NOT NULL ,
 - [LogLogger] nvarchar(500) NOT NULL ,
 - [LogMessage] nvarchar(3000) NOT NULL ,
 - [LogActionClick] nvarchar(4000) NULL ,
 - [UserName] nvarchar(30) NULL ,
 - [UserIP] varchar(20) NULL
 - )
 
2:创建项目然后下载log4net.dll 在项目中添加引用http://logging.apache.org/log4net/download_log4net.cgi下载Binaries 下面的
3:创建 log4net.config
<?xml version="1.0" encoding="utf-8" ?>
- <log4net debug="false">
 - <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
 - <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
 - <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
 - <bufferSize value="0" />
 - <!--日志数据库连接串-->
 - <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
 - <connectionString value="DATABASE=GoodLook;SERVER=xx.xx.140.170;UID=sa;PWD=123456a;Connect Timeout=30;" />
 - <!--日志数据库脚本-->
 - <commandText value="INSERT INTO LogDetails ([LogDate],[LogThread],[LogLevel],[LogLogger],[LogActionClick],[LogMessage],[UserName],[UserIP]) VALUES (@log_date, @thread, @log_level, @logger, @ActionsClick, @message,@UserName,@UserIP)" />
 - <!--日志时间LogDate -->
 - <parameter>
 - <parameterName value="@log_date" />
 - <dbType value="DateTime" />
 - <layout type="log4net.Layout.RawTimeStampLayout" />
 - </parameter>
 - <!--线程号-->
 - <parameter>
 - <parameterName value="@thread" />
 - <dbType value="String" />
 - <size value="100" />
 - <layout type="log4net.Layout.PatternLayout">
 - <conversionPattern value="%t" />
 - </layout>
 - </parameter>
 - <!--日志类型LogLevel -->
 - <parameter>
 - <parameterName value="@log_level" />
 - <dbType value="String" />
 - <size value="200" />
 - <layout type="log4net.Layout.PatternLayout">
 - <conversionPattern value="%p" />
 - </layout>
 - </parameter>
 - <!--日志名称-->
 - <parameter>
 - <parameterName value="@logger" />
 - <dbType value="String" />
 - <size value="500" />
 - <layout type="log4net.Layout.PatternLayout">
 - <conversionPattern value="%logger" />
 - </layout>
 - </parameter>
 - <parameter>
 - <parameterName value="@message" />
 - <dbType value="String" />
 - <size value="3000" />
 - <layout type="Log4NetApply.MyLayout">
 - <conversionPattern value="%property{Message}" />
 - </layout>
 - </parameter>
 - <parameter>
 - <parameterName value="@ActionsClick" />
 - <dbType value="String" />
 - <size value="4000" />
 - <layout type="Log4NetApply.MyLayout" >
 - <conversionPattern value = "%property{ActionsClick}"/>
 - </layout>
 - </parameter>
 - <!--自定义UserName -->
 - <parameter>
 - <parameterName value="@UserName" />
 - <dbType value="String" />
 - <size value="30" />
 - <layout type="Log4NetApply.MyLayout" >
 - <!--log4net.MDC.Set("UserName", "asdfasdf");
 - <conversionPattern value = "%X{UserName}"/>-->
 - <conversionPattern value = "%property{UserName}"/>
 - </layout>
 - </parameter>
 - <parameter>
 - <parameterName value="@UserIP" />
 - <dbType value="String" />
 - <size value="20" />
 - <layout type="Log4NetApply.MyLayout" >
 - <conversionPattern value = "%property{UserIP}"/>
 - </layout>
 - </parameter>
 - </appender>
 - <!-- setup the root category, add the appenders and set the default level -->
 - <root>
 - <level value="Warn"/><!-- 定义记录的日志级别-->
 - <level value="Info"/>
 - <level value="Debug"/>
 - <level value="Fine"/>
 - <appender-ref ref="ADONetAppender" /><!-- 记录到什么介质中-->
 - </root>
 - <!-- specify the level for some specific categories -->
 - <!--//关于上边root到logger这块,如果同时出现,有可能会出现重复插入记录的情况:-->
 - <!--<logger name="iNotes">
 - <level value="WARN"/>
 - <level value="INFO"/>
 - <level value="DEBUG"/>
 - <level value="FINE"/>
 - <appender-ref ref="ADONetAppender"/>
 - </logger>
 - <logger name="StellaLogger">
 - <level value="ALL"/>
 - <appender-ref ref="AdoNetAppender" />
 - </logger>-->
 - <appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
 - <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
 - <param name="File" value="D:/Log/" />
 - <!--是否追加到文件-->
 - <param name="AppendToFile" value="true" />
 - <!--记录日志写入文件时,不锁定文本文件-->
 - <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
 - <!--Unicode编码-->
 - <!--<Encoding value="UTF-8" />-->
 - <!--最多产生的日志文件数,value="-1"为不限文件数-->
 - <!--<param name="MaxSizeRollBackups" value="10" />-->
 - <!--是否只写到一个文件中-->
 - <param name="StaticLogFileName" value="false" />
 - <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
 - <param name="RollingStyle" value="Composite" />
 - <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]-->
 - <param name="DatePattern" value="yyyy-MM-dd/"ReflectionLayout.log"" />
 - <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />-->
 - <!--<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />-->
 - <!--每个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增加1重新命名-->
 - <param name="maximumFileSize" value="500KB" />
 - <!--记录的格式。-->
 - <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
 - <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>
 - </log4net>
 
4:在Web.config 里面加 configSections 节点 (CS可直接写在app.config里面,或者都写在一个config里面)
<configuration>
<strong> <span style="color:#FF0000;"> <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net configSource="log4net.config"/></span></strong>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
</configuration>
5:Properties 属性下面的AssemblyInfo.cs 追加 必须有这个,否则写入不到数据库中
- //[assembly: log4net.Config.XmlConfigurator(Watch = true)]
 - //注意: ConfigFile 可以指定相对路径 和 绝对路径。 eg: /log/xxxx.log 或者 d://log//xxxx.log
 - [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
 
6:添加 Global.asax ,然后在Application_Start 追加 读取配置程序文件
- protected void Application_Start(object sender, EventArgs e)
 - {
 - //应用程序启动时,自动加载配置log4Net
 - XmlConfigurator.Configure();
 - }
 
7:创建自定义类 LogPublicClass.cs,为了方便写入数据库中 自定义的一些信息
using log4net.Layout;
- using System;
 - using System.Collections.Generic;
 - using System.Linq;
 - using System.Reflection;
 - using System.Web;
 - namespace Log4NetApply
 - {
 - /// <summary>
 - /// 包含了所有的自定字段属性
 - /// </summary>
 - public class LogContent
 - {
 - public LogContent(string macAddress, string computerName, string actionsclick, string description)
 - {
 - UserIP = macAddress;
 - UserName = computerName;
 - ActionsClick = actionsclick;
 - Message = description;
 - }
 - /// <summary>
 - /// 访问IP
 - /// </summary>
 - public string UserIP { get; set; }
 - /// <summary>
 - /// 系统登陆用户
 - /// </summary>
 - public string UserName { get; set; }
 - /// <summary>
 - /// 动作事件
 - /// </summary>
 - public string ActionsClick { get; set; }
 - /// <summary>
 - /// 日志描述信息
 - /// </summary>
 - public string Message { get; set; }
 - }
 - public class MyLayout : PatternLayout
 - {
 - public MyLayout()
 - {
 - this.AddConverter("property", typeof(LogInfoPatternConverter));
 - }
 - }
 - public class LogInfoPatternConverter : 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());
 - }
 - }
 - /// <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;
 - }
 - }
 - }
 
8:示例使用
- try
 - {
 - log.Info(new LogContent("127.0.0.1", "111111", "登陆系统", "登陆成功"));
 - var ss = 1 - int.Parse("sss");
 - }
 - catch(Exception ex)
 - {
 - log.Error(new LogContent("127.0.0.1", "111111", "登陆系统", ex.Message+":"+ex.StackTrace));
 - }
 
C# 利用log4net 把日志写入到数据库表中的更多相关文章
- C# 利用log4net 把日志写入到数据库
		
效果图: 1:第一步创建SQL表结构 CREATE TABLE [dbo].[LogDetails] ( [LogID] int NOT NULL IDENTITY(1,1) , [Log ...
 - c#用log4Net将日志写入到Oracle数据库,并写入到文件中
		
原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:/ ...
 - C# log4net 日志写入到数据库
		
原文:C# log4net 日志写入到数据库 效果图: 1:第一步创建SQL表结构 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
 - log4net将日志写入ElasticSearch
		
log4net将日志写入ElasticSearch https://www.cnblogs.com/huangxincheng/p/9120028.html 很多小步快跑的公司,开发人员多则3-4个, ...
 - 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
		
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
 - File操作-将txt里的内容写入到数据库表
		
package com.Cristin.File;//将txt里的内容写入到数据库表 import com.Cristin.MySQL.AddDataToDB;import org.testng.an ...
 - EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
		
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
 - 将DataFrame数据如何写入到Hive表中
		
1.将DataFrame数据如何写入到Hive表中?2.通过那个API实现创建spark临时表?3.如何将DataFrame数据写入hive指定数据表的分区中? 从spark1.2 到spark1.3 ...
 - 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件
		
本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar 工作中曾有个为42张表建立测 ...
 
随机推荐
- IIS服务器添加网站
			
1.添加IIS服务:对“我的电脑”右键,管理,点击服务和应用程序,如果下面没有”Internet Information Services(IIS)管理器“,打开控制面板,点击程序,启用或者关闭Win ...
 - 有效单词词广场——算法面试刷题5(for google),考察数学
			
给定一个单词序列,检查它是否构成一个有效单词广场.一个有效的单词广场应满足以下条件:对于满足0≤k<max(numRows numColumns)的k,第k行和第k列对应的字符串应该相同,. 给 ...
 - 点击input消除默认背景颜色:focus
			
1.在谷歌浏览器会出现默认点击input框黄色背景,如何去除? //消除google浏览器黄色框 input:-webkit-autofill, input:-webkit-autofill:hove ...
 - “全栈2019”Java多线程第十四章:线程与堆栈详解
			
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
 - [Bootstrap-Table] 中的事件用例
			
[Bootstrap-Table] 中的事件 -------------------------------------------------- <div class="alert ...
 - Dubbo自定义日志拦截器
			
前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...
 - npm安装包很慢
			
每次安装时: 可以通过指定 --registry,指向国内镜像服务器地址来加快安装速度. npm install -gd express --registry=http://registry.npm. ...
 - 有向图的拓扑排序的理解和简单实现(Java)
			
如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...
 - jmeter的non-gui模式的使用
			
jmeter的non-gui模式的使用,待补充
 - easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300  解决方案
			
easy-mock本地部署成功后,迫不及待的想看看是否能正常访问,执行命令 npm run dev 启动项目,访问 127.0.0.1:7300 ,结果郁闷的是报错:EADDRNOTAVAIL 0.0 ...