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 log4net.Layout.Pattern;
- 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));
- }
其他自行参考下列文章
- http://www.cnblogs.com/kissazi2/p/3393151.html
- http://blog.csdn.net/zdw_wym/article/details/48802821
- http://blog.csdn.net/ydm19891101/article/details/50561638
- http://www。w2bc。com/Article/70140
- http://www.cnblogs.com/yuangang/archive/2016/05/16/5497140.html
出处:https://blog.csdn.net/kongwei521/article/details/52242319
C# 利用log4net 把日志写入到数据库的更多相关文章
- C# 利用log4net 把日志写入到数据库表中
效果图: 1:第一步创建SQL表结构 CREATE TABLE [dbo].[LogDetails] ( [LogID] int NOT NULL IDENTITY(1,1) , [LogDat ...
- 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个, ...
- log4net 将日志写入数据库
asp.net利用log4net写入日志到SqlServer数据库,Log4net是一个开源的错误日志记录项目,易用性强,源自log4j,品质值得信赖. 下面就我的安装部署log4net到MS sql ...
- 关于使用Log4Net将日志插入oracle数据库中
1.关于配置文件. <?xml version="1.0" encoding="utf-8" ?> <configuration> &l ...
- .net core 中使用Log4net输出日志到Mysql数据库中
.net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...
- log4net自定义字段写入SqlServer数据库 ASP.net
首先申明,本示例经过本作者亲自试验通过,可以运行 第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置 <?xml version="1 ...
- C# 利用Log4Net进行日志记录
概述 本文主要简单说明如何使用Log4Net进行日志记录,在程序开发过程中记录日志的优点: 它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug: 一旦在程序中加入了Log 输出 ...
随机推荐
- BatchConfigTool批量配置工具
海康批量配置工具BatchConfigTool是一款支持设备在线搜索.批量配置参数.批量升级等功能的软件,支持对大批量设备同时进行各参数的配置,极大的简化了操作过程! 软件功能 1.对在线设备进行搜索 ...
- mysql 5.7开启sql日志的配置
今天把数据库换成了5.7的,想查通过sql日志定位下问题,但是发现和以前的方式不一样了,特意记录下来 通过开启mysql的日志功能,可以记录所有别执行过的sql语句记录,便于维护数据库数据. 在数据库 ...
- Windows下编译Redis5.0.5
先去弄Cygwin环境 http://www.cygwin.com/ 下载完成 打开 下一步 下一步 下一步 下一步 下一步,出现一个界面,让你添加地址,你打开官网,选择mirror sites,点击 ...
- [转帖]Zookeeper入门看这篇就够了
Zookeeper入门看这篇就够了 https://my.oschina.net/u/3796575/blog/1845035 Zookeeper是什么 官方文档上这么解释zookeeper,它是一个 ...
- Python代码约定
建议遵守以下约定: 使用 4 个空格来缩进 永远不要混用空格和制表符 在函数之间空一行 在类之间空两行 字典,列表,元组以及参数列表中,在 , 后添加一个空格.对于字典,: 后面也添加一个空格 在赋值 ...
- golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- mysql执行顺序与join连接
mysql加载顺序 手写顺序 SELECT DISTINCT <select list> FROM <left_table> join <join_type> JO ...
- 阿里巴巴 Java 开发手册 (九) 异常日志
(一) 异常处理 1. [强制]Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该 通过 catch 来处理,比如:IndexOutOfBoundsExc ...
- 【夯实基础】- Integer.valueof()和Integer.parseInt()的区别
今天在看公司代码的时候,看到有人在将 String 转为 int 时,用到了Integer.parseInt(String s)方法,我一直用的是Integer.valueOf(String s)方法 ...
- jq+swiper 实现今日头条App的选项卡效果
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...