从入门到精晓ASP,使用线程列队写入

本身的种类结构如下图:

索引

索引

前言:

差不多全体的特大型应用都会有温馨的用于跟踪调节和测试的API。因为若是程序被布署以往,就不太恐怕再使用专门的调剂工具了。但是1个大班只怕必要有一套强大的日记系统来检查判断和修补配置上的难点。所以这年就须求三个记录日志的工具。log4net是.net中常用的一个日志记录工具,及这个时候先来介绍一下:

开发工具vs20一七

【注意项目名称不要为log四net,否者在此后安顿log四net出错】

亚洲必赢官网 1

【无私分享:从入门到精通ASP.NET MVC】从0起始,一起搭框架、做项目 目录索引

简述

前二日事情相比较多,推延更新了,希望我们多多原谅,前日我们后续做大家的报到作用

花色准备

咱俩用的工具是:VS 20一叁 + SqlServer 贰零1三 + IIS七.5

期待大家对ASP.NET
MVC有一个从头的领悟,理论性的东西大家不做过多解释,某些地点不知底也没涉及,会用就行了,用的多了,用的久了,自然就知道了。

连串上马

1、Spring容器的计划注入

前壹篇,大家新建了多少个Xml配置文件,并且我们制造了用户接口和达成类,今日,首先呢,大家来注入Service,大家前边在Service类库下边新建了个文本夹Config并且添加了八个放置能源ComService.xml和Service.xml。

作者们事先讲过,Com呢表示大家一些通用的东西,就像大家的通用类库叫Common,那只是私有的命名习惯,并非MVC要求大家。因为大家创立的用户表是管理员表,所以小编把那一个布局放到Service.xml里,我们来修改一下Service.xml

亚洲必赢官网 2

 

 

代码:

亚洲必赢官网 3亚洲必赢官网 4

1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3   <description>Spring注入Service,容器指向本层层封装的接口,舍弃Dao层,减少代码量</description>
4   <!--系统管理begin-->
5   <!--用户管理-->
6   <object id="Service.User" type="Service.ServiceImp.UserManage,Service" singleton="false">
7   </object>
8   <!--系统管理end-->
9 </objects>

View Code

 

二、Log4net

咱俩在此插入一段,理解一下log四net记录日志,那一个前面大家不少地点都要用到。

log四net是一个成效盛名的开源日志记录组件。利用log四net能够方便地将日志新闻记录到文件、控制台、Windows事件日志和数据库(包括MS
SQL Server, Access,
Oracle9i,Oracle八i,DB2,SQLite)中。并且我们还足以记载控制要记载的日志级别,能够记载的日志系列包含:FATAL(致命错误)、E汉兰达RO奥迪Q5(一般错误)、WA帕杰罗N(警告)、INFO(一般音信)、DEBUG(调节和测试音讯)。超越4/8的日记记录都以记录到文件,我们根本记录到数据库,那正如方便我们的指挥者查看日志事件。

1、安装log4net

安装形式壹:

安装格局2(推荐):通过NuGet安装log四net
 命令:Install-Package log4net

亚洲必赢官网 5

亚洲必赢官网 6

亚洲必赢官网 7

 

2、在品种的程序集音讯描述文件中,设置Log肆net的可记下属性

亚洲必赢官网 8

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

 

三、在程序根目录添加log四net的安插文件
log肆net.config

亚洲必赢官网 9

 

 

自身把陈设代码贴给我们:

亚洲必赢官网 10亚洲必赢官网 11

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <configuration>
  3   <configSections>
  4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  5   </configSections>
  6   <log4net>
  7     <root>
  8       <level value="ALL"/>
  9     </root>
 10     <logger name="dblog" additivity="false">
 11       <level value="ALL"/>
 12       <appender-ref ref="SqlServerAppender" />
 13     </logger>
 14     <!--Oracle数据库-->
 15     <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender">
 16       <!-- Oracle数据源-->
 17       <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
 18       <!-- Oracle连接字符串-->
 19       <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/>
 20       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/>
 21       <!--  
 22              设置缓存区大小  
 23              1表明有一条日志就要写入  
 24              如果10就表示日志到达10条时一起写入  
 25              -->
 26       <bufferSize value="0"/>
 27       <parameter>
 28         <parameterName value=":Dates" />
 29         <dbType value="DateTime" />
 30         <layout type="log4net.Layout.RawTimeStampLayout"/>
 31       </parameter>
 32       <parameter>
 33         <parameterName value=":Levels" />
 34         <dbType value="String" />
 35         <size value="50" />
 36         <layout type="log4net.Layout.PatternLayout">
 37           <conversionPattern value="%level" />
 38         </layout>
 39       </parameter>
 40       <parameter>
 41         <parameterName value=":Logger" />
 42         <dbType value="String" />
 43         <size value="200" />
 44         <layout type="log4net.Layout.PatternLayout">
 45           <conversionPattern value="%logger" />
 46         </layout>
 47       </parameter>
 48       <parameter>
 49         <parameterName value=":Message" />
 50         <dbType value="String" />
 51         <size value="4000" />
 52         <layout type="log4net.Layout.PatternLayout">
 53           <conversionPattern value="%message" />
 54         </layout>
 55       </parameter>
 56       <parameter>
 57         <parameterName value=":Exception" />
 58         <dbType value="String" />
 59         <size value="4000" />
 60         <layout type="log4net.Layout.PatternLayout">
 61           <conversionPattern value="%exception" />
 62         </layout>
 63       </parameter>
 64       <!--DIY-->
 65       <parameter>
 66         <parameterName value=":ClientUser" />
 67         <dbType value="String" />
 68         <size value="100" />
 69         <layout type="log4net.Layout.PatternLayout">
 70           <conversionPattern value="%property{ClientUser}" />
 71         </layout>
 72       </parameter>
 73       <parameter>
 74         <parameterName value=":ClientIP" />
 75         <dbType value="String" />
 76         <size value="20" />
 77         <layout type="log4net.Layout.PatternLayout">
 78           <conversionPattern value="%property{ClientIP}" />
 79         </layout>
 80       </parameter>
 81       <parameter>
 82         <parameterName value=":RequestUrl" />
 83         <dbType value="String" />
 84         <size value="500" />
 85         <layout type="log4net.Layout.PatternLayout">
 86           <conversionPattern value="%property{RequestUrl}" />
 87         </layout>
 88       </parameter>
 89       <parameter>
 90         <parameterName value=":Action" />
 91         <dbType value="String" />
 92         <size value="20" />
 93         <layout type="log4net.Layout.PatternLayout">
 94           <conversionPattern value="%property{Action}" />
 95         </layout>
 96       </parameter>
 97     </appender>
 98     <!--Sqlite数据库-->
 99     <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">
100       <bufferSize value="0" />
101       <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
102       <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />
103       <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />
104       <parameter>
105         <parameterName value="@Date" />
106         <dbType value="DateTime" />
107         <layout type="log4net.Layout.RawTimeStampLayout" />
108       </parameter>
109       <parameter>
110         <parameterName value="@Level" />
111         <dbType value="String" />
112         <layout type="log4net.Layout.PatternLayout">
113           <conversionPattern value="%level" />
114         </layout>
115       </parameter>
116       <parameter>
117         <parameterName value="@Logger" />
118         <dbType value="String" />
119         <layout type="log4net.Layout.PatternLayout">
120           <conversionPattern value="%logger" />
121         </layout>
122       </parameter>
123       <parameter>
124         <parameterName value="@ClientUser" />
125         <dbType value="String" />
126         <layout type="log4net.Layout.PatternLayout">
127           <conversionPattern value="%property{ClientUser}" />
128         </layout>
129       </parameter>
130       <parameter>
131         <parameterName value="@ClientIP" />
132         <dbType value="String" />
133         <layout type="log4net.Layout.PatternLayout">
134           <conversionPattern value="%property{ClientIP}" />
135         </layout>
136       </parameter>
137       <parameter>
138         <parameterName value="@RequestUrl" />
139         <dbType value="String" />
140         <layout type="log4net.Layout.PatternLayout">
141           <conversionPattern value="%property{RequestUrl}" />
142         </layout>
143       </parameter>
144       <parameter>
145         <parameterName value="@Action" />
146         <dbType value="String" />
147         <layout type="log4net.Layout.PatternLayout">
148           <conversionPattern value="%property{Action}" />
149         </layout>
150       </parameter>
151       <parameter>
152         <parameterName value="@Message" />
153         <dbType value="String" />
154         <layout type="log4net.Layout.PatternLayout">
155           <conversionPattern value="%message" />
156         </layout>
157       </parameter>
158       <parameter>
159         <parameterName value="@Exception" />
160         <dbType value="String" />
161         <layout type="log4net.Layout.PatternLayout">
162           <conversionPattern value="%exception" />
163         </layout>
164       </parameter>
165     </appender>
166     <!--SqlServer数据库-->
167     <appender name="SqlServerAppender" type="log4net.Appender.AdoNetAppender">
168       <!-- SqlServer数据源-->
169       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
170       <!-- SqlServer连接字符串-->
171       <connectionString value="data source=.;initial catalog=wkmvc_db;integrated security=false;persist security info=True;User ID=sa_wkmvc;Password=123456" />
172       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,ClientUser,ClientIP,RequestUrl,Action,Message,Exception)VALUES(@Dates,@Levels,@Logger,@ClientUser,@ClientIP,@RequestUrl,@Action,@Message,@Exception)"/>
173       <!--  
174              设置缓存区大小  
175              1表明有一条日志就要写入  
176              如果10就表示日志到达10条时一起写入  
177              -->
178       <bufferSize value="0"/>
179       <parameter>
180         <parameterName value="@Dates" />
181         <dbType value="DateTime" />
182         <layout type="log4net.Layout.RawTimeStampLayout" />
183       </parameter>
184       <parameter>
185         <parameterName value="@Levels" />
186         <dbType value="String" />
187         <size value="50" />
188         <layout type="log4net.Layout.PatternLayout">
189           <conversionPattern value="%level" />
190         </layout>
191       </parameter>
192       <parameter>
193         <parameterName value="@Logger" />
194         <dbType value="String" />
195         <size value="255" />
196         <layout type="log4net.Layout.PatternLayout">
197           <conversionPattern value="%logger" />
198         </layout>
199       </parameter>
200       <parameter>
201         <parameterName value="@Message" />
202         <dbType value="String" />
203         <size value="4000" />
204         <layout type="log4net.Layout.PatternLayout">
205           <conversionPattern value="%message" />
206         </layout>
207       </parameter>
208       <parameter>
209         <parameterName value="@Exception" />
210         <dbType value="String" />
211         <size value="2000" />
212         <layout type="log4net.Layout.ExceptionLayout" />
213       </parameter>
214       <!--DIY-->
215       <parameter>
216         <parameterName value="@ClientUser" />
217         <dbType value="String" />
218         <size value="100" />
219         <layout type="log4net.Layout.PatternLayout" >
220           <param name="ConversionPattern" value="%property{ClientUser}"/>
221         </layout>
222       </parameter>
223       <parameter>
224         <parameterName value="@ClientIP" />
225         <dbType value="String" />
226         <size value="100" />
227         <layout type="log4net.Layout.PatternLayout" >
228           <param name="ConversionPattern" value="%property{ClientIP}"/>
229         </layout>
230       </parameter>
231       <parameter>
232         <parameterName value="@RequestUrl" />
233         <dbType value="String" />
234         <size value="500" />
235         <layout type="log4net.Layout.PatternLayout" >
236           <param name="ConversionPattern" value="%property{RequestUrl}"/>
237         </layout>
238       </parameter>
239       <parameter>
240         <parameterName value="@Action" />
241         <dbType value="String" />
242         <size value="100" />
243         <layout type="log4net.Layout.PatternLayout" >
244           <param name="ConversionPattern" value="%property{Action}"/>
245         </layout>
246       </parameter>
247     </appender>
248     <!--记录到文件-->
249     <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
250       <param name="File" value="datalog" />
251       <param name="AppendToFile" value="true" />
252       <param name="RollingStyle" value="Date" />
253       <param name="DatePattern" value="\\yyyy\\MM-dd-HH\\&quot;SQL_&quot;yyyy-MM-dd&quot;.log&quot;" />
254       <param name="StaticLogFileName" value="false" />
255       <layout type="log4net.Layout.PatternLayout,log4net">
256         <param name="ConversionPattern" value="%d - %m%n" />
257         <param name="Header" value="&#xD;&#xA;----------------------begin--------------------------&#xD;&#xA;" />
258         <param name="Footer" value="&#xD;&#xA;----------------------end--------------------------&#xD;&#xA;" />
259       </layout>
260     </appender>
261   </log4net>
262   <!--必须指定框架,否则不执行,新版本默认支持4.0,可修改源文件,项目属性设定为.NET FRAMEWORK2.0后,打开重新编译,去掉其中的.NET 4.0编译导致错误环节,如此只能使用在.net 2.0框架-->
263   <startup>
264     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
265   </startup>
266 </configuration>
267 <!--
268    调用实例
269    log4net.ILog log = log4net.LogManager.GetLogger("Filelog");
270    log.Info(Message);
271    
272     %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
273 
274     %n(new line):换行
275 
276     %d(datetime):输出当前语句运行的时刻
277 
278     %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
279 
280     %t(thread id):当前语句所在的线程ID
281 
282     %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
283 
284     %c(class):当前日志对象的名称
285     
286     %L:输出语句所在的行号
287 
288     %F:输出语句所在的文件名
289 
290     %-数字:表示该项的最小长度,如果不够,则用空格填充
291 
292     例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
293 
294     176 [main] INFO  org.foo.Bar - Located nearest gas station.
295     -->

View Code

 

四、下边包车型大巴代码中,大家配备日志记录到了数据库的日志表 SYS_LOG

亚洲必赢官网 12

我们在数据库中新建那几个日志表:

 

 

数据库名:wkmvc_从入门到精晓ASP,使用线程列队写入。db

表名:SYS_LOG

 

序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
1 ID int 4 0     主键ID
2 DATES datetime 8 3         创建时间
3 LEVELS nvarchar 20 0         日志等级
4 LOGGER nvarchar 200 0         日志调用
5 CLIENTUSER nvarchar 100 0         使用用户
6 CLIENTIP nvarchar 20 0         访问IP
7 REQUESTURL nvarchar 500 0         访问来源
8 ACTION nvarchar 20 0         操作动作
9 MESSAGE nvarchar 4000 0         消息
10 EXCEPTION nvarchar 4000 0         异常消息

 

T-SQL:

亚洲必赢官网 13亚洲必赢官网 14

 1 USE [wkmvc_db]
 2 GO
 3 /****** Object:  Table [dbo].[SYS_LOG]    Script Date: 2016/5/16 9:06:19 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 CREATE TABLE [dbo].[SYS_LOG](
 9     [ID] [int] IDENTITY(1,1) NOT NULL,
10     [DATES] [datetime] NULL,
11     [LEVELS] [nvarchar](20) NULL,
12     [LOGGER] [nvarchar](200) NULL,
13     [CLIENTUSER] [nvarchar](100) NULL,
14     [CLIENTIP] [nvarchar](20) NULL,
15     [REQUESTURL] [nvarchar](500) NULL,
16     [ACTION] [nvarchar](20) NULL,
17     [MESSAGE] [nvarchar](4000) NULL,
18     [EXCEPTION] [nvarchar](4000) NULL,
19  CONSTRAINT [PK_SYS_LOG] PRIMARY KEY CLUSTERED 
20 (
21     [ID] ASC
22 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
23 ) ON [PRIMARY]
24 
25 GO
26 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主键ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ID'
27 GO
28 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'DATES'
29 GO
30 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志等级' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LEVELS'
31 GO
32 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志调用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LOGGER'
33 GO
34 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'使用用户' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTUSER'
35 GO
36 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问IP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTIP'
37 GO
38 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问来源' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'REQUESTURL'
39 GO
40 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作动作' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ACTION'
41 GO
42 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'MESSAGE'
43 GO
44 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'异常消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'EXCEPTION'
45 GO

View Code

 

三、新建用户登录控制器 AccountController

在/Areas/SysManage/Controllers 下新建AccountController控制器

亚洲必赢官网 15

 

村办习惯,大家分块控制器的代码,便于减弱、管理
用#region #endregion,#region是c#预处理器指令,是一个分块预处理命令,它根本用来编辑代码的支行,在编译时会被机关删除。

亚洲必赢官网 16

 

 

先贴一下那些代码:

亚洲必赢官网 17亚洲必赢官网 18

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace WebPage.Areas.SysManage.Controllers
 8 {
 9     public class AccountController : Controller
10     {
11         #region 声明容器
12         #endregion
13 
14         #region 基本视图
15         public ActionResult Index()
16         {
17             return View();
18         }
19         #endregion
20 
21         #region 帮助方法
22         #endregion
23     }
24 }

View Code

 

咱俩上1篇,在Config文件夹下边建立了八个xml文件,并且在Web.Config里面配备了针对性,大家在Controllers.xml里安顿一下接口的针对性

亚洲必赢官网 19

 

 

代码:

亚洲必赢官网 20亚洲必赢官网 21

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <objects xmlns="http://www.springframework.net">
 3   <description>Spring注入控制器,容器指向Service层封装的接口</description>
 4   <!--系统管理 Begin-->
 5   <!--登录控制器-->
 6   <object type="WebPage.Areas.SysManage.Controllers.AccountController,WebPage" singleton="false">
 7     <property name="UserManage" ref="Service.User"/>
 8   </object>
 9   <!--系统管理 end-->
10 </objects>

View Code

 

OK,我们再回来大家的AccountController

咱俩添加一下消除方案的引用

亚洲必赢官网 22

 

咱们在注脚容器里声称一下UserManage

亚洲必赢官网 23

 

大家在主导视图里,为Index添加三个视图:(这些中没有表明,大家不用急,大家前面渐渐修改那么些页面,我们先达成基本作用)

亚洲必赢官网 24亚洲必赢官网 25

 1 @model Domain.SYS_USER
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5     <meta charset="utf-8">
 6     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 7     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 8     <title>后台登录</title>
 9 </head>
10 <body>
11     <div >
12         <div>
13             @using (Ajax.BeginForm("login", null, new AjaxOptions()
14                         {
15                             HttpMethod = "Post",
16                             OnBegin = "dig.Loading",
17                             OnSuccess = "dig.Success",
18                             OnFailure = "dig.Failure",
19                             OnComplete = "dig.Complete"
20                         }, new { @class = "form-signin" }))
21             {
22                 @Html.AntiForgeryToken()
23                 @Html.TextBoxFor(model => model.ACCOUNT,
24                                                         new
25                                                         {
26                                                             @class = "form-control",
27                                                             @placeholder = "登录用户名",
28                                                             @maxlength = 15,
29                                                             @required = "required"
30                                                         })
31                 @Html.PasswordFor(model => model.PASSWORD,
32                                                         new
33                                                         {
34                                                             @class = "form-control",
35                                                             @placeholder = "登录密码",
36                                                             @maxlength = 12,
37                                                             @required = "required"
38                                                         })                     
39                 <button type="submit" id="login-button"></button>
40             }
41            
42         </div>
43      
44     </div>
45 
46    
47     <script type="text/javascript" src="/Content/js/jquery.min.js"></script>
48     <script type="text/javascript" src="/Content/js/jquery.unobtrusive-ajax.min.js"></script>
49     <script type="text/javascript">       
50         var dig = {
51             Loading: function () {
52                 $("#login-button").attr("disabled", "disabled");;
53             },
54             Success: function (result) {
55                 if (result.Status == "y") {
56                     alert(result.Msg)
57                 } else {
58                    alert(result.Msg);
59                     dig.Complete();
60                 }
61             },
62             Failure: function () {
63                 alert(result.Msg);
64                 dig.Complete();
65             },
66             Complete: function () {
67                 $("#login-button").attr("disabled", false);
68             },
69             ErrorMsg: function (msg) {
70                 alert(msg);
71             }
72         };
73     </script>
74 
75 </body>
76 </html>

View Code

 我们新建3个登6验证的艺术 Login

亚洲必赢官网 26亚洲必赢官网 27

 1         /// <summary>
 2         /// 登录验证
 3         /// add yuangang by 2016-05-16
 4         /// </summary>
 5         [ValidateAntiForgeryToken]
 6         public ActionResult Login(Domain.SYS_USER item)
 7         {
 8             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
 9             try
10             {
11                 //调用登录验证接口 返回用户实体类
12                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
13                 if (users != null)
14                 {
15                     //是否锁定
16                     if (users.ISCANLOGIN == 1)
17                     {
18                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
19                         return Json(json);
20                     }
21                     json.Status = "y";
22 
23                 }
24                 else
25                 {
26                     json.Msg = "用户名或密码不正确";
27                 }
28 
29             }
30             catch (Exception e)
31             {
32                 json.Msg = e.Message;
33             }
34             return Json(json, JsonRequestBehavior.AllowGet);
35         }

View Code

 

再也生成一下缓解方案,大家来测试一下

亚洲必赢官网 28

 

 

报错了~(不要顾虑报错,报错是咱们DeBug并且梳理流程的好机遇哈~)

亚洲必赢官网 29

 

咱俩先来商讨一下那一个错误:

捕捉到 System.NullReferenceException
HResult=-2147467261
Message=未将对象引用设置到目的的实例。
Source=WebPage
StackTrace:
在 WebPage.Areas.SysManage.Controllers.AccountController.Login(SYS_USER
item) 位置 e:\Visual Studio
2013\BlogDemos\wkmvc\WebPage\Areas\SysManage\Controllers\AccountController.cs:行号
37

那是何许错误啊,错误在这一行 var users =
UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWOCR-VD.Trim());
那应该是UserManage
未将目的引用设置到目的的实例,大家分析,有十分大希望是大家阐明的器皿出错了。

不过,大家的宣示和注入貌似未有怎么难点呀,那是怎么回事呢,大家看一下
大家Web.Config里的布置

亚洲必赢官网 30

咱俩还从未添加Spring.net组件啊~~~

加上一下,NetGet包 

亚洲必赢官网 31

 

还有Common.Logging

咱俩的Spring有多少个dll
分别是Spring.Core、Common.Logging、Spring.Web.Mvc(我们那边用的是Spring.Web.Mvc5)

检查一下,那多少个dll是还是不是引用了

亚洲必赢官网 32

 

今昔运转一下,是否照旧报错呢可能为将对象设置引用到实例怎么回事呢?好像忘了些什么,仅仅只是配置配好了,spring.net的容器还尚无接管那总体……在那大家只须求让Global.asax文件的MvcApplication类继承于Spring.Web.Mvc.SpringMvcApplication类即可,根据要求override相关方就能够了

亚洲必赢官网 33

 

 

OK!运维寻常~~~~

亚洲必赢官网 34

 

 

恐怕出现的难点:

亚洲必赢官网 35

 

或:

亚洲必赢官网 36

 

解决:

笔者们添加Microsoft.AspNet.WebApi(要是存在就创新一下)

亚洲必赢官网 37

 

或透过NuGet
程序包管理器控制台添加:

Install-Package Microsoft.AspNet.WebApi

Update-Package Microsoft.AspNet.WebApi -reinstall(存在)

案由:大家新建的是一个空的MVC项目,贫乏引用

 

 

四、使用Log4net

小编们抬高级中学一年级下log四net的类库 【C#公家帮忙类】 Log四net
辅助类

亚洲必赢官网 38

 

作者们在AccountController控制器中声称一下

亚洲必赢官网 39

 

 

大家修改一下 登录验证方法Login

亚洲必赢官网 40

 

 

代码:

亚洲必赢官网 41亚洲必赢官网 42

 1 using Common;
 2 using Service.IService;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Web;
 7 using System.Web.Mvc;
 8 
 9 namespace WebPage.Areas.SysManage.Controllers
10 {
11     public class AccountController : Controller
12     {
13         #region 声明容器
14         /// <summary>
15         /// 用户管理
16         /// add yuangang by 2016-05-16
17         /// </summary>
18         IUserManage UserManage { get; set; }
19         /// <summary>
20         /// 日志记录
21         /// </summary>
22         log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog");
23         #endregion
24 
25         #region 基本视图
26         public ActionResult Index()
27         {
28             return View();
29         }
30         /// <summary>
31         /// 登录验证
32         /// add yuangang by 2016-05-16
33         /// </summary>
34         [ValidateAntiForgeryToken]
35         public ActionResult Login(Domain.SYS_USER item)
36         {
37             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
38             try
39             {
40                 //调用登录验证接口 返回用户实体类
41                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
42                 if (users != null)
43                 {
44                     //是否锁定
45                     if (users.ISCANLOGIN == 1)
46                     {
47                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
48                         log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
49                         return Json(json);
50                     }
51                     json.Status = "y";
52                     log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
53 
54                 }
55                 else
56                 {
57                     json.Msg = "用户名或密码不正确";
58                     log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
59                 }
60 
61             }
62             catch (Exception e)
63             {
64                 json.Msg = e.Message;
65                 log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
66             }
67             return Json(json, JsonRequestBehavior.AllowGet);
68         }
69         #endregion
70 
71         #region 帮助方法
72         #endregion
73     }
74 }

View Code

 

今日就先写到那,下1篇,大家继续周到那几个登录成效~好累~

你们先本人做一下,境遇题目百度同意,留言也好,我们消除一下。稍后本身把这1某些的德姆o
提供一下下载。

 

原创小说转发请尊重劳动成果 http://yuangang.cnblogs.com

【无私分享:从入门到精晓ASP.NET MVC】从0早先,1起搭框架、做项目 目录索引

简述

前二日事情相比较多,拖延更新了,希望我们多多包含,前几日大家再三再四做大家的记名功用

种类准备

笔者们用的工具是:VS 20一3 + SqlServer 2011 + IIS7.伍

可望大家对ASP.NET
MVC有贰个起首的接头,理论性的事物大家不做过多解释,有个别地点不知晓也没提到,会用就行了,用的多了,用的久了,自然就驾驭了。

品类初步

一、Spring容器的安顿注入

前1篇,大家新建了多少个Xml配置文件,并且我们创制了用户接口和兑现类,今日,首先呢,大家来注入Service,大家事先在Service类库上面新建了个文本夹Config并且添加了多少个放置财富ComService.xml和瑟维斯.xml。

我们事先讲过,Com呢表示大家一些通用的事物,仿佛大家的通用类库叫Common,那只是私有的命名习惯,并非MVC需求大家。因为我们成立的用户表是管理员表,所以作者把这一个布局放到瑟维斯.xml里,大家来修改一下Service.xml

亚洲必赢官网 43

 

 

代码:

亚洲必赢官网 44亚洲必赢官网 45

1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3   <description>Spring注入Service,容器指向本层层封装的接口,舍弃Dao层,减少代码量</description>
4   <!--系统管理begin-->
5   <!--用户管理-->
6   <object id="Service.User" type="Service.ServiceImp.UserManage,Service" singleton="false">
7   </object>
8   <!--系统管理end-->
9 </objects>

View Code

 

二、Log4net

大家在此插入壹段,精通一下log四net记录日志,那么些前面大家不少位置都要用到。

log4net是3个成效知名的开源日志记录组件。利用log四net能够1本万利地将日志音信记录到文件、控制台、Windows事件日志和数据库(包罗MS
SQL Server, Access,
Oracle玖i,Oracle8i,DB二,SQLite)中。并且大家还是可以够记载控制要记载的日记级别,能够记载的日记类别包蕴:FATAL(致命错误)、ECRUISERROEscort(1般错误)、WA逍客N(警告)、INFO(1般新闻)、DEBUG(调节和测试新闻)。大多数的日志记录都以记录到文件,大家重点记录到数据库,那正如有利大家的组织者查看日志事件。

1、安装log4net

安装方式一:

安装格局二(推荐):通过NuGet安装log4net
 命令:Install-Package log四net

亚洲必赢官网 46

亚洲必赢官网 47

亚洲必赢官网 48

 

二、在品种的次序集音讯描述文件中,设置Log四net的可记下属性

亚洲必赢官网 49

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

 

三、在先后根目录添加log4net的配备文件
log四net.config

亚洲必赢官网 50

 

 

本人把安排代码贴给大家:

亚洲必赢官网 51亚洲必赢官网 52

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <configuration>
  3   <configSections>
  4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  5   </configSections>
  6   <log4net>
  7     <root>
  8       <level value="ALL"/>
  9     </root>
 10     <logger name="dblog" additivity="false">
 11       <level value="ALL"/>
 12       <appender-ref ref="SqlServerAppender" />
 13     </logger>
 14     <!--Oracle数据库-->
 15     <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender">
 16       <!-- Oracle数据源-->
 17       <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
 18       <!-- Oracle连接字符串-->
 19       <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/>
 20       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/>
 21       <!--  
 22              设置缓存区大小  
 23              1表明有一条日志就要写入  
 24              如果10就表示日志到达10条时一起写入  
 25              -->
 26       <bufferSize value="0"/>
 27       <parameter>
 28         <parameterName value=":Dates" />
 29         <dbType value="DateTime" />
 30         <layout type="log4net.Layout.RawTimeStampLayout"/>
 31       </parameter>
 32       <parameter>
 33         <parameterName value=":Levels" />
 34         <dbType value="String" />
 35         <size value="50" />
 36         <layout type="log4net.Layout.PatternLayout">
 37           <conversionPattern value="%level" />
 38         </layout>
 39       </parameter>
 40       <parameter>
 41         <parameterName value=":Logger" />
 42         <dbType value="String" />
 43         <size value="200" />
 44         <layout type="log4net.Layout.PatternLayout">
 45           <conversionPattern value="%logger" />
 46         </layout>
 47       </parameter>
 48       <parameter>
 49         <parameterName value=":Message" />
 50         <dbType value="String" />
 51         <size value="4000" />
 52         <layout type="log4net.Layout.PatternLayout">
 53           <conversionPattern value="%message" />
 54         </layout>
 55       </parameter>
 56       <parameter>
 57         <parameterName value=":Exception" />
 58         <dbType value="String" />
 59         <size value="4000" />
 60         <layout type="log4net.Layout.PatternLayout">
 61           <conversionPattern value="%exception" />
 62         </layout>
 63       </parameter>
 64       <!--DIY-->
 65       <parameter>
 66         <parameterName value=":ClientUser" />
 67         <dbType value="String" />
 68         <size value="100" />
 69         <layout type="log4net.Layout.PatternLayout">
 70           <conversionPattern value="%property{ClientUser}" />
 71         </layout>
 72       </parameter>
 73       <parameter>
 74         <parameterName value=":ClientIP" />
 75         <dbType value="String" />
 76         <size value="20" />
 77         <layout type="log4net.Layout.PatternLayout">
 78           <conversionPattern value="%property{ClientIP}" />
 79         </layout>
 80       </parameter>
 81       <parameter>
 82         <parameterName value=":RequestUrl" />
 83         <dbType value="String" />
 84         <size value="500" />
 85         <layout type="log4net.Layout.PatternLayout">
 86           <conversionPattern value="%property{RequestUrl}" />
 87         </layout>
 88       </parameter>
 89       <parameter>
 90         <parameterName value=":Action" />
 91         <dbType value="String" />
 92         <size value="20" />
 93         <layout type="log4net.Layout.PatternLayout">
 94           <conversionPattern value="%property{Action}" />
 95         </layout>
 96       </parameter>
 97     </appender>
 98     <!--Sqlite数据库-->
 99     <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">
100       <bufferSize value="0" />
101       <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
102       <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />
103       <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />
104       <parameter>
105         <parameterName value="@Date" />
106         <dbType value="DateTime" />
107         <layout type="log4net.Layout.RawTimeStampLayout" />
108       </parameter>
109       <parameter>
110         <parameterName value="@Level" />
111         <dbType value="String" />
112         <layout type="log4net.Layout.PatternLayout">
113           <conversionPattern value="%level" />
114         </layout>
115       </parameter>
116       <parameter>
117         <parameterName value="@Logger" />
118         <dbType value="String" />
119         <layout type="log4net.Layout.PatternLayout">
120           <conversionPattern value="%logger" />
121         </layout>
122       </parameter>
123       <parameter>
124         <parameterName value="@ClientUser" />
125         <dbType value="String" />
126         <layout type="log4net.Layout.PatternLayout">
127           <conversionPattern value="%property{ClientUser}" />
128         </layout>
129       </parameter>
130       <parameter>
131         <parameterName value="@ClientIP" />
132         <dbType value="String" />
133         <layout type="log4net.Layout.PatternLayout">
134           <conversionPattern value="%property{ClientIP}" />
135         </layout>
136       </parameter>
137       <parameter>
138         <parameterName value="@RequestUrl" />
139         <dbType value="String" />
140         <layout type="log4net.Layout.PatternLayout">
141           <conversionPattern value="%property{RequestUrl}" />
142         </layout>
143       </parameter>
144       <parameter>
145         <parameterName value="@Action" />
146         <dbType value="String" />
147         <layout type="log4net.Layout.PatternLayout">
148           <conversionPattern value="%property{Action}" />
149         </layout>
150       </parameter>
151       <parameter>
152         <parameterName value="@Message" />
153         <dbType value="String" />
154         <layout type="log4net.Layout.PatternLayout">
155           <conversionPattern value="%message" />
156         </layout>
157       </parameter>
158       <parameter>
159         <parameterName value="@Exception" />
160         <dbType value="String" />
161         <layout type="log4net.Layout.PatternLayout">
162           <conversionPattern value="%exception" />
163         </layout>
164       </parameter>
165     </appender>
166     <!--SqlServer数据库-->
167     <appender name="SqlServerAppender" type="log4net.Appender.AdoNetAppender">
168       <!-- SqlServer数据源-->
169       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
170       <!-- SqlServer连接字符串-->
171       <connectionString value="data source=.;initial catalog=wkmvc_db;integrated security=false;persist security info=True;User ID=sa_wkmvc;Password=123456" />
172       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,ClientUser,ClientIP,RequestUrl,Action,Message,Exception)VALUES(@Dates,@Levels,@Logger,@ClientUser,@ClientIP,@RequestUrl,@Action,@Message,@Exception)"/>
173       <!--  
174              设置缓存区大小  
175              1表明有一条日志就要写入  
176              如果10就表示日志到达10条时一起写入  
177              -->
178       <bufferSize value="0"/>
179       <parameter>
180         <parameterName value="@Dates" />
181         <dbType value="DateTime" />
182         <layout type="log4net.Layout.RawTimeStampLayout" />
183       </parameter>
184       <parameter>
185         <parameterName value="@Levels" />
186         <dbType value="String" />
187         <size value="50" />
188         <layout type="log4net.Layout.PatternLayout">
189           <conversionPattern value="%level" />
190         </layout>
191       </parameter>
192       <parameter>
193         <parameterName value="@Logger" />
194         <dbType value="String" />
195         <size value="255" />
196         <layout type="log4net.Layout.PatternLayout">
197           <conversionPattern value="%logger" />
198         </layout>
199       </parameter>
200       <parameter>
201         <parameterName value="@Message" />
202         <dbType value="String" />
203         <size value="4000" />
204         <layout type="log4net.Layout.PatternLayout">
205           <conversionPattern value="%message" />
206         </layout>
207       </parameter>
208       <parameter>
209         <parameterName value="@Exception" />
210         <dbType value="String" />
211         <size value="2000" />
212         <layout type="log4net.Layout.ExceptionLayout" />
213       </parameter>
214       <!--DIY-->
215       <parameter>
216         <parameterName value="@ClientUser" />
217         <dbType value="String" />
218         <size value="100" />
219         <layout type="log4net.Layout.PatternLayout" >
220           <param name="ConversionPattern" value="%property{ClientUser}"/>
221         </layout>
222       </parameter>
223       <parameter>
224         <parameterName value="@ClientIP" />
225         <dbType value="String" />
226         <size value="100" />
227         <layout type="log4net.Layout.PatternLayout" >
228           <param name="ConversionPattern" value="%property{ClientIP}"/>
229         </layout>
230       </parameter>
231       <parameter>
232         <parameterName value="@RequestUrl" />
233         <dbType value="String" />
234         <size value="500" />
235         <layout type="log4net.Layout.PatternLayout" >
236           <param name="ConversionPattern" value="%property{RequestUrl}"/>
237         </layout>
238       </parameter>
239       <parameter>
240         <parameterName value="@Action" />
241         <dbType value="String" />
242         <size value="100" />
243         <layout type="log4net.Layout.PatternLayout" >
244           <param name="ConversionPattern" value="%property{Action}"/>
245         </layout>
246       </parameter>
247     </appender>
248     <!--记录到文件-->
249     <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
250       <param name="File" value="datalog" />
251       <param name="AppendToFile" value="true" />
252       <param name="RollingStyle" value="Date" />
253       <param name="DatePattern" value="\\yyyy\\MM-dd-HH\\&quot;SQL_&quot;yyyy-MM-dd&quot;.log&quot;" />
254       <param name="StaticLogFileName" value="false" />
255       <layout type="log4net.Layout.PatternLayout,log4net">
256         <param name="ConversionPattern" value="%d - %m%n" />
257         <param name="Header" value="&#xD;&#xA;----------------------begin--------------------------&#xD;&#xA;" />
258         <param name="Footer" value="&#xD;&#xA;----------------------end--------------------------&#xD;&#xA;" />
259       </layout>
260     </appender>
261   </log4net>
262   <!--必须指定框架,否则不执行,新版本默认支持4.0,可修改源文件,项目属性设定为.NET FRAMEWORK2.0后,打开重新编译,去掉其中的.NET 4.0编译导致错误环节,如此只能使用在.net 2.0框架-->
263   <startup>
264     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
265   </startup>
266 </configuration>
267 <!--
268    调用实例
269    log4net.ILog log = log4net.LogManager.GetLogger("Filelog");
270    log.Info(Message);
271    
272     %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
273 
274     %n(new line):换行
275 
276     %d(datetime):输出当前语句运行的时刻
277 
278     %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
279 
280     %t(thread id):当前语句所在的线程ID
281 
282     %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
283 
284     %c(class):当前日志对象的名称
285     
286     %L:输出语句所在的行号
287 
288     %F:输出语句所在的文件名
289 
290     %-数字:表示该项的最小长度,如果不够,则用空格填充
291 
292     例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
293 
294     176 [main] INFO  org.foo.Bar - Located nearest gas station.
295     -->

View Code

 

4、上边的代码中,大家布署日志记录到了数据库的日志表 SYS_LOG

亚洲必赢官网 53

我们在数据库中新建那一个日志表:

 

 

数据库名:wkmvc_db

表名:SYS_LOG

 

序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
1 ID int 4 0     主键ID
2 DATES datetime 8 3         创建时间
3 LEVELS nvarchar 20 0         日志等级
4 LOGGER nvarchar 200 0         日志调用
5 CLIENTUSER nvarchar 100 0         使用用户
6 CLIENTIP nvarchar 20 0         访问IP
7 REQUESTURL nvarchar 500 0         访问来源
8 ACTION nvarchar 20 0         操作动作
9 MESSAGE nvarchar 4000 0         消息
10 EXCEPTION nvarchar 4000 0         异常消息

 

T-SQL:

亚洲必赢官网 54亚洲必赢官网 55

 1 USE [wkmvc_db]
 2 GO
 3 /****** Object:  Table [dbo].[SYS_LOG]    Script Date: 2016/5/16 9:06:19 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 CREATE TABLE [dbo].[SYS_LOG](
 9     [ID] [int] IDENTITY(1,1) NOT NULL,
10     [DATES] [datetime] NULL,
11     [LEVELS] [nvarchar](20) NULL,
12     [LOGGER] [nvarchar](200) NULL,
13     [CLIENTUSER] [nvarchar](100) NULL,
14     [CLIENTIP] [nvarchar](20) NULL,
15     [REQUESTURL] [nvarchar](500) NULL,
16     [ACTION] [nvarchar](20) NULL,
17     [MESSAGE] [nvarchar](4000) NULL,
18     [EXCEPTION] [nvarchar](4000) NULL,
19  CONSTRAINT [PK_SYS_LOG] PRIMARY KEY CLUSTERED 
20 (
21     [ID] ASC
22 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
23 ) ON [PRIMARY]
24 
25 GO
26 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主键ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ID'
27 GO
28 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'DATES'
29 GO
30 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志等级' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LEVELS'
31 GO
32 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志调用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LOGGER'
33 GO
34 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'使用用户' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTUSER'
35 GO
36 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问IP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTIP'
37 GO
38 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问来源' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'REQUESTURL'
39 GO
40 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作动作' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ACTION'
41 GO
42 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'MESSAGE'
43 GO
44 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'异常消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'EXCEPTION'
45 GO

View Code

 

三、新建用户登录控制器 AccountController

在/Areas/SysManage/Controllers 下新建AccountController控制器

亚洲必赢官网 56

 

私家习惯,我们分块控制器的代码,便于收缩、管理
用#region #endregion,#region是c#预处理器指令,是叁个分块预处理命令,它根本用以编辑代码的分层,在编写翻译时会被机关删除。

亚洲必赢官网 57

 

 

先贴一下这些代码:

亚洲必赢官网 58亚洲必赢官网 59

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace WebPage.Areas.SysManage.Controllers
 8 {
 9     public class AccountController : Controller
10     {
11         #region 声明容器
12         #endregion
13 
14         #region 基本视图
15         public ActionResult Index()
16         {
17             return View();
18         }
19         #endregion
20 
21         #region 帮助方法
22         #endregion
23     }
24 }

View Code

 

咱俩上一篇,在Config文件夹上边建立了四个xml文件,并且在Web.Config里面配备了针对性,大家在Controllers.xml里安排一下接口的针对性

亚洲必赢官网 60

 

 

代码:

亚洲必赢官网 61亚洲必赢官网 62

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <objects xmlns="http://www.springframework.net">
 3   <description>Spring注入控制器,容器指向Service层封装的接口</description>
 4   <!--系统管理 Begin-->
 5   <!--登录控制器-->
 6   <object type="WebPage.Areas.SysManage.Controllers.AccountController,WebPage" singleton="false">
 7     <property name="UserManage" ref="Service.User"/>
 8   </object>
 9   <!--系统管理 end-->
10 </objects>

View Code

 

OK,我们再重返我们的AccountController

咱俩添加一下化解方案的引用

亚洲必赢官网 63

 

大家在宣称容器里声称一下UserManage

亚洲必赢官网 64

 

我们在着力视图里,为Index添加二个视图:(这其间未有表达,我们不要急,大家前面逐步修改那个页面,大家先达成基本效用)

亚洲必赢官网 65亚洲必赢官网 66

 1 @model Domain.SYS_USER
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5     <meta charset="utf-8">
 6     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 7     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 8     <title>后台登录</title>
 9 </head>
10 <body>
11     <div >
12         <div>
13             @using (Ajax.BeginForm("login", null, new AjaxOptions()
14                         {
15                             HttpMethod = "Post",
16                             OnBegin = "dig.Loading",
17                             OnSuccess = "dig.Success",
18                             OnFailure = "dig.Failure",
19                             OnComplete = "dig.Complete"
20                         }, new { @class = "form-signin" }))
21             {
22                 @Html.AntiForgeryToken()
23                 @Html.TextBoxFor(model => model.ACCOUNT,
24                                                         new
25                                                         {
26                                                             @class = "form-control",
27                                                             @placeholder = "登录用户名",
28                                                             @maxlength = 15,
29                                                             @required = "required"
30                                                         })
31                 @Html.PasswordFor(model => model.PASSWORD,
32                                                         new
33                                                         {
34                                                             @class = "form-control",
35                                                             @placeholder = "登录密码",
36                                                             @maxlength = 12,
37                                                             @required = "required"
38                                                         })                     
39                 <button type="submit" id="login-button"></button>
40             }
41            
42         </div>
43      
44     </div>
45 
46    
47     <script type="text/javascript" src="/Content/js/jquery.min.js"></script>
48     <script type="text/javascript" src="/Content/js/jquery.unobtrusive-ajax.min.js"></script>
49     <script type="text/javascript">       
50         var dig = {
51             Loading: function () {
52                 $("#login-button").attr("disabled", "disabled");;
53             },
54             Success: function (result) {
55                 if (result.Status == "y") {
56                     alert(result.Msg)
57                 } else {
58                    alert(result.Msg);
59                     dig.Complete();
60                 }
61             },
62             Failure: function () {
63                 alert(result.Msg);
64                 dig.Complete();
65             },
66             Complete: function () {
67                 $("#login-button").attr("disabled", false);
68             },
69             ErrorMsg: function (msg) {
70                 alert(msg);
71             }
72         };
73     </script>
74 
75 </body>
76 </html>

View Code

 我们新建2个登六验证的措施 Login

亚洲必赢官网 67亚洲必赢官网 68

 1         /// <summary>
 2         /// 登录验证
 3         /// add yuangang by 2016-05-16
 4         /// </summary>
 5         [ValidateAntiForgeryToken]
 6         public ActionResult Login(Domain.SYS_USER item)
 7         {
 8             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
 9             try
10             {
11                 //调用登录验证接口 返回用户实体类
12                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
13                 if (users != null)
14                 {
15                     //是否锁定
16                     if (users.ISCANLOGIN == 1)
17                     {
18                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
19                         return Json(json);
20                     }
21                     json.Status = "y";
22 
23                 }
24                 else
25                 {
26                     json.Msg = "用户名或密码不正确";
27                 }
28 
29             }
30             catch (Exception e)
31             {
32                 json.Msg = e.Message;
33             }
34             return Json(json, JsonRequestBehavior.AllowGet);
35         }

View Code

 

重复生成一下化解方案,大家来测试一下

亚洲必赢官网 69

 

 

报错了~(不要担心报错,报错是我们DeBug并且梳理流程的好机遇哈~)

亚洲必赢官网 70

 

咱俩先来切磋一下这些荒唐:

捕捉到 System.NullReferenceException
HResult=-2147467261
Message=未将对象引用设置到指标的实例。
Source=WebPage
StackTrace:
在 WebPage.Areas.SysManage.Controllers.AccountController.Login(SYS_USER
item) 位置 e:\Visual Studio
2013\BlogDemos\wkmvc\WebPage\Areas\SysManage\Controllers\AccountController.cs:行号
37

这是何许错误啊,错误在这1行 var users =
UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWOTucsonD.Trim());
那应该是UserManage
未将目的引用设置到目的的实例,大家解析,有望是大家注解的器皿出错了。

只是,大家的宣示和注入貌似未有啥问题呀,那是怎么回事呢,我们看一下
大家Web.Config里的安插

亚洲必赢官网 71

小编们还不曾拉长Spring.net组件啊~~~

添加一下,NetGet包 

亚洲必赢官网 72

 

还有Common.Logging

咱俩的Spring有多少个dll
分别是Spring.Core、Common.Logging、Spring.Web.Mvc(我们那里用的是Spring.Web.Mvc5)

检查一下,那多少个dll是或不是引用了

亚洲必赢官网 73

 

以后运作一下,是否要么报错呢要么为将目的设置引用到实例怎么回事呢?好像忘了些什么,仅仅只是配置配好了,spring.net的容器还并未有接管那全体……在那大家只需求让Global.asax文件的MvcApplication类继承于Spring.Web.Mvc.SpringMvcApplication类即可,依照必要override相关方就足以了

亚洲必赢官网 74

 

 

OK!运转如常~~~~

亚洲必赢官网 75

 

 

或是出现的难题:

亚洲必赢官网 76

 

或:

亚洲必赢官网 77

 

解决:

我们添加Microsoft.AspNet.WebApi(假若存在就更新一下)

亚洲必赢官网 78

 

或透过NuGet
程序包管理器控制台添加:

Install-Package Microsoft.AspNet.WebApi

Update-Package Microsoft.AspNet.WebApi -reinstall(存在)

案由:大家新建的是多少个空的MVC项目,缺乏引用

 

 

四、使用Log4net

作者们抬高级中学一年级下log4net的类库 【C#公共帮忙类】 Log四net
扶助类

亚洲必赢官网 79

 

咱俩在AccountController控制器中声美赞臣(Meadjohnson)下

亚洲必赢官网 80

 

 

我们修改一下 登录验证方法Login

亚洲必赢官网 81

 

 

代码:

亚洲必赢官网 82亚洲必赢官网 83

 1 using Common;
 2 using Service.IService;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Web;
 7 using System.Web.Mvc;
 8 
 9 namespace WebPage.Areas.SysManage.Controllers
10 {
11     public class AccountController : Controller
12     {
13         #region 声明容器
14         /// <summary>
15         /// 用户管理
16         /// add yuangang by 2016-05-16
17         /// </summary>
18         IUserManage UserManage { get; set; }
19         /// <summary>
20         /// 日志记录
21         /// </summary>
22         log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog");
23         #endregion
24 
25         #region 基本视图
26         public ActionResult Index()
27         {
28             return View();
29         }
30         /// <summary>
31         /// 登录验证
32         /// add yuangang by 2016-05-16
33         /// </summary>
34         [ValidateAntiForgeryToken]
35         public ActionResult Login(Domain.SYS_USER item)
36         {
37             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
38             try
39             {
40                 //调用登录验证接口 返回用户实体类
41                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
42                 if (users != null)
43                 {
44                     //是否锁定
45                     if (users.ISCANLOGIN == 1)
46                     {
47                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
48                         log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
49                         return Json(json);
50                     }
51                     json.Status = "y";
52                     log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
53 
54                 }
55                 else
56                 {
57                     json.Msg = "用户名或密码不正确";
58                     log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
59                 }
60 
61             }
62             catch (Exception e)
63             {
64                 json.Msg = e.Message;
65                 log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
66             }
67             return Json(json, JsonRequestBehavior.AllowGet);
68         }
69         #endregion
70 
71         #region 帮助方法
72         #endregion
73     }
74 }

View Code

 

前些天就先写到那,下一篇,大家再而三完善那一个登录功能~好累~

你们先本身做一下,遭受难点百度承认,留言也好,我们化解一下。稍后自个儿把那一部分的Demo
提供一下下载。

 

原创文章转发请敬爱劳动成果 http://yuangang.cnblogs.com

1】NuGet中引用Log4net包

亚洲必赢官网 84

日志支持类库须要log4net包:工具—NuGet包管理器—管理消除方案NuGet程序包

二】添加web配置文件命名称为log4new.config并在中写入以下代码

亚洲必赢官网 85

亚洲必赢官网 86亚洲必赢官网 87

<?xml version="1.0" encoding="utf-8"?><configuration>  <system.web>    <compilation debug="true" targetFramework="4.5" />    <httpRuntime targetFramework="4.5" />  </system.web>  <configSections>    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.2" />  </configSections>  <!--配置log4net-->   <log4net>    <root>    </root>    <logger name="RollingLogFileAppender">      <level value="ALL" />      <appender-ref ref="RollingFileDebug" />      <appender-ref ref="RollingFileInfo" />      <appender-ref ref="RollingFileWarn" />      <appender-ref ref="RollingFileError" />      <appender-ref ref="RollingFileFatal" />    </logger>    <appender name="RollingFileDebug" type="log4net.Appender.RollingFileAppender">      <!--文件路径 如果不设置(去掉 value="Log/Debug/")会默认保存到[App_Data]文件夹中-->      <param name="File" value="Log/Debug/"/>      <!--追加到文件-->      <param name="AppendToFile" value="true"/>      <!--最多保留的文件数,设为"-1"则不限-->      <param name="MaxSizeRollBackups" value="10"/>      <!--写到一个文件-->      <param name="StaticLogFileName" value="false"/>      <!--文件名,按日期命名-->      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->      <param name="RollingStyle" value="Date"/>      <!--日志格式-->      <layout type="log4net.Layout.PatternLayout">        <!--%newline输出的日志会换行 [%date{HH:mm:ss fff}]表示记录的时间   -->        <conversionPattern value="[%date{HH:mm:ss fff}] %- %message%newline" />        <!--如果想自己设置格式就只需要-->        <!--<conversionPattern value="%message"/>-->      </layout>      <lockingmodel type="log4net.appender.fileappender+minimallock" />      <filter type="log4net.Filter.LevelRangeFilter">        <param name="LevelMin" value="Debug" />        <param name="LevelMax" value="Debug" />      </filter>    </appender>    <appender name="RollingFileInfo" type="log4net.Appender.RollingFileAppender">      <param name="File" value="Log/Info/"/>      <param name="AppendToFile" value="true"/>      <param name="MaxSizeRollBackups" value="10"/>      <param name="StaticLogFileName" value="false"/>      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>      <param name="RollingStyle" value="Date"/>      <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="[%date{HH:mm:ss fff}] %- %message%newline" />      </layout>      <lockingmodel type="log4net.appender.fileappender+minimallock" />      <filter type="log4net.Filter.LevelRangeFilter">        <param name="LevelMin" value="INFO" />        <param name="LevelMax" value="INFO" />      </filter>    </appender>    <appender name="RollingFileWarn" type="log4net.Appender.RollingFileAppender">      <param name="File" value="Log/Warn/"/>      <param name="AppendToFile" value="true"/>      <param name="MaxSizeRollBackups" value="10"/>      <param name="StaticLogFileName" value="false"/>      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>      <param name="RollingStyle" value="Date"/>      <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="[%date{HH:mm:ss fff}] %- %message%newline" />      </layout>      <lockingmodel type="log4net.appender.fileappender+minimallock" />      <filter type="log4net.Filter.LevelRangeFilter">        <param name="LevelMin" value="WARN" />        <param name="LevelMax" value="WARN" />      </filter>    </appender>    <appender name="RollingFileError" type="log4net.Appender.RollingFileAppender">      <param name="File" value="Log/Error/"/>      <param name="AppendToFile" value="true"/>      <param name="MaxSizeRollBackups" value="10"/>      <param name="StaticLogFileName" value="false"/>      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>      <param name="RollingStyle" value="Date"/>      <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="[%date{HH:mm:ss fff}] %- %message%newline" />      </layout>      <lockingmodel type="log4net.appender.fileappender+minimallock" />      <filter type="log4net.Filter.LevelRangeFilter">        <param name="LevelMin" value="ERROR" />        <param name="LevelMax" value="ERROR" />      </filter>    </appender>    <appender name="RollingFileFatal" type="log4net.Appender.RollingFileAppender">      <param name="File" value="Log/Fatal/"/>      <param name="AppendToFile" value="true"/>      <param name="MaxSizeRollBackups" value="10"/>      <param name="StaticLogFileName" value="false"/>      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>      <param name="RollingStyle" value="Date"/>      <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="[%date{HH:mm:ss fff}] %- %message%newline" />      </layout>      <lockingmodel type="log4net.appender.fileappender+minimallock" />      <filter type="log4net.Filter.LevelRangeFilter">        <param name="LevelMin" value="FATAL" />        <param name="LevelMax" value="FATAL" />      </filter>    </appender>  </log4net> </configuration>

View Code

亚洲必赢官网 88

三】在Global.asax中添加代码

亚洲必赢官网 89亚洲必赢官网 90

//配置log4log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("~/Web.config")));

亚洲必赢官网,View Code

亚洲必赢官网 91

线程日志支持类 FlashLogger.cs 代码

肆】写3个LogHelper.cs不过注意在那个.cs文件的命名空间写上[assembly: log4net.Config.XmlConfigurator(ConfigFile = “log4net.config”, Watch = true)]

在意ConfigFile 前边跟的是布置文件的相对路径

亚洲必赢官网 92

LogHelper代码

亚洲必赢官网 93亚洲必赢官网 94

    public class LogHelper    {        public static readonly ILog Log = LogManager.GetLogger("RollingLogFileAppender");         //        log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。         //ALL 最低等级的,用于打开所有日志记录。        //DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。         //INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,        //WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。        //ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。        //FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。        //TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。          //OFF 最高等级的,用于关闭所有日志记录。        //如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。        #region DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。         public static void debug(string write)        {            Log.Debug("日志记录:" + write);        }        public static void debug(string write, Exception ex)        {            Log.Debug("日志记录:" + write + "。错误记载:" + ex.ToString;        }        #endregion        #region INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,        /// <summary>        /// 1        /// </summary>        /// <param name="write"></param>        public static void Info(string write)        {            Log.Info("日志记录:" + write);        }        public static void Info(string write, Exception ex)        {            Log.Info("日志记录:" + write + "。错误记载:" + ex.ToString;        }        #endregion        #region WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。,可以使用这个级别。        public static void warn(string write)        {            Log.Warn("日志记录:" + write);        }        public static void warn(string write, Exception ex)        {            Log.Warn("日志记录:" + write + "。错误记载:" + ex.ToString;        }        #endregion        #region ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。        public static void error(string write)        {            Log.Error("日志记录:" + write);        }        public static void error(string write, Exception ex)        {            Log.Error("日志记录:" + write + "。错误记载:" + ex.ToString;        }        #endregion        #region FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。        public static void fatal(string write)        {            Log.Fatal("日志记录:" + write);        }        public static void fatal(string write, Exception ex)        {            Log.Fatal("日志记录:" + write + "。错误记载:" + ex.ToString;        }        //#endregion        #endregion        //定义输出的日志内容        public static string logMessage(SysLogMsg logMessage)        {            StringBuilder strInfo = new StringBuilder();            strInfo.Append("\r\n1. 错误: >> 操作时间: " + logMessage.OperationTime + "   操作人: " + logMessage.UserName + " \r\n");            strInfo.Append("2. 类名: " + logMessage.Class + " \r\n");            strInfo.Append("3. 内容: " + logMessage.Content + "\r\n");            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");            return strInfo.ToString();        }    }

View Code

亚洲必赢官网 95亚洲必赢官网 96

5】最后能够开头写日志 ,能够团结定义1种日志格式【自身写2个model,定义多少个参数 时间、操作人、类名等等】

亚洲必赢官网 97

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using log4net;
using log4net.Config;

namespace FlashLog
{
    public sealed class FlashLogger
    {
        /// <summary>
        /// 记录消息Queue
        /// </summary>
        private readonly ConcurrentQueue<FlashLogMessage> _que;

        /// <summary>
        /// 信号
        /// </summary>
        private readonly ManualResetEvent _mre;

        /// <summary>
        /// 日志
        /// </summary>
        private readonly ILog _log;

        /// <summary>
        /// 日志
        /// </summary>
        private static FlashLogger _flashLog = new FlashLogger();


        private FlashLogger()
        {
            var configFile = new FileInfo(HttpContext.Current.Server.MapPath("~/log4net.config"));
            if (!configFile.Exists)
            {
                throw new Exception("未配置log4net配置文件!");
            }

            // 设置日志配置文件路径
            XmlConfigurator.Configure(configFile);

            _que = new ConcurrentQueue<FlashLogMessage>();
            _mre = new ManualResetEvent(false);
            _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        }

        /// <summary>
        /// 实现单例
        /// </summary>
        /// <returns></returns>
        public static FlashLogger Instance()
        {
            return _flashLog;
        }

        /// <summary>
        /// 另一个线程记录日志,只在程序初始化时调用一次
        /// </summary>
        public void Register()
        {
            Thread t = new Thread(new ThreadStart(WriteLog));
            t.IsBackground = false;
            t.Start();
        }

        /// <summary>
        /// 从队列中写日志至磁盘
        /// </summary>
        private void WriteLog()
        {
            while (true)
            {
                // 等待信号通知
                _mre.WaitOne();

                FlashLogMessage msg;
                // 判断是否有内容需要如磁盘 从列队中获取内容,并删除列队中的内容
                while (_que.Count > 0 && _que.TryDequeue(out msg))
                {
                    // 判断日志等级,然后写日志
                    switch (msg.Level)
                    {
                        case FlashLogLevel.Debug:
                            _log.Debug(msg.Message, msg.Exception);
                            break;
                        case FlashLogLevel.Info:
                            _log.Info(msg.Message, msg.Exception);
                            break;
                        case FlashLogLevel.Error:
                            _log.Error(msg.Message, msg.Exception);
                            break;
                        case FlashLogLevel.Warn:
                            _log.Warn(msg.Message, msg.Exception);
                            break;
                        case FlashLogLevel.Fatal:
                            _log.Fatal(msg.Message, msg.Exception);
                            break;
                    }
                }

                // 重新设置信号
                _mre.Reset();
                Thread.Sleep(1);
            }
        }


        /// <summary>
        /// 写日志
        /// </summary>
        /// <param name="message">日志文本</param>
        /// <param name="level">等级</param>
        /// <param name="ex">Exception</param>
        public void EnqueueMessage(string message, FlashLogLevel level, Exception ex = null)
        {
            if ((level == FlashLogLevel.Debug && _log.IsDebugEnabled)
             || (level == FlashLogLevel.Error && _log.IsErrorEnabled)
             || (level == FlashLogLevel.Fatal && _log.IsFatalEnabled)
             || (level == FlashLogLevel.Info && _log.IsInfoEnabled)
             || (level == FlashLogLevel.Warn && _log.IsWarnEnabled))
            {
                _que.Enqueue(new FlashLogMessage
                {
                    Message = "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff") + "]\r\n" + message,
                    Level = level,
                    Exception = ex
                });

                // 通知线程往磁盘中写日志
                _mre.Set();
            }
        }

        public static void Debug(string msg, Exception ex = null)
        {
            Instance().EnqueueMessage(msg, FlashLogLevel.Debug, ex);
        }

        public static void Error(string msg, Exception ex = null)
        {
            Instance().EnqueueMessage(msg, FlashLogLevel.Error, ex);
        }

        public static void Fatal(string msg, Exception ex = null)
        {
            Instance().EnqueueMessage(msg, FlashLogLevel.Fatal, ex);
        }

        public static void Info(string msg, Exception ex = null)
        {
            Instance().EnqueueMessage(msg, FlashLogLevel.Info, ex);
        }

        public static void Warn(string msg, Exception ex = null)
        {
            Instance().EnqueueMessage(msg, FlashLogLevel.Warn, ex);
        }

    }
    /// <summary>
    /// 日志等级
    /// </summary>
    public enum FlashLogLevel
    {
        Debug,
        Info,
        Error,
        Warn,
        Fatal
    }
    /// <summary>
    /// 日志内容
    /// </summary>
    public class FlashLogMessage
    {
        public string Message { get; set; }
        public FlashLogLevel Level { get; set; }
        public Exception Exception { get; set; }

    }
}

最后依照log4new.config设置的门道找到日志所在【未定义的话1般在项目标bin/Debug 或许 bin/Release目录下】 第五个是默许格式日志,第一个是温馨定的格式日志【都以string类型,只不过第三个使用\t\n换行,稍微美化一下出口格式】

<param name=”File” value=”Log/Debug/”/>
表示在此时此刻文件夹Log/Debug中

亚洲必赢官网 98亚洲必赢官网 99

亚洲必赢官网 100

最终附上githup地址

View Code

WebForm项目创立:

1.内需引用线程日志类库 FlashLog

二.添加log4net安插文件 log四net.config,完毕了数据库及文件记录日志

亚洲必赢官网 101亚洲必赢官网 102

CREATE TABLE ErrorLog
(
    dtDate DATETIME,
    sThread NVARCHAR(100),
    sLevel NVARCHAR(100),
    sLogger NVARCHAR(500),
    sMessage NVARCHAR(500), 
    sException NTEXT
) 

View Code

亚洲必赢官网 103亚洲必赢官网 104

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net debug="false">
    <!-- 将日志信息写入SQL Server数据库-->
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="SERVER=服务器;DATABASE=数据库;UID=用户名;PWD=密码;Connect Timeout=15;" />
      <commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <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>
      <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="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <!-- 将日志信息写入到项目日志文件 -->
    <appender name="LogToFile" type="log4net.Appender.RollingFileAppender">
      <encoding value="utf-8" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <file value="Logs\" />
      <datePattern value="yyyy.MM.dd'.log'" />
      <staticLogFileName value="false" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="50MB" />
      <layout type="log4net.Layout.PatternLayout">
        <ConversionPattern value="%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message %newline" />
      </layout>
    </appender>

    <!--设置根目录,添加appenders并设置默认日志等级 -->
    <root>
      <level value="All" />
      <appender-ref ref="ADONetAppender" />
      <appender-ref ref="LogToFile"/>
    </root>
  </log4net>

</configuration>

View Code

三.内需添加全局应用程序类 Global.asax

亚洲必赢官网 105亚洲必赢官网 106

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace LogWeb
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            // 在应用程序启动时运行的代码
            FlashLog.FlashLogger.Instance().Register();
        }
    }
}

View Code

4.实例应用:访问无效域名时记录错误日志

亚洲必赢官网 107亚洲必赢官网 108

                try
                {
                    string checkTonkenUrl = "http://url.abcde.com";
                    WebRequest wRequest = WebRequest.Create(checkTonkenUrl);
                    wRequest.Method = "GET";
                    wRequest.ContentType = "text/html;charset=UTF-8";
                    WebResponse wResponse = wRequest.GetResponse();
                    Stream stream = wResponse.GetResponseStream();
                    StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
                    string str = reader.ReadToEnd();   //url返回的值
                }
                catch (Exception ex)
                {
                    FlashLogger.Error("Error", ex);
                }

View Code

亚洲必赢官网 109

亚洲必赢官网 110

到此,log四net日志配置完结。

连锁程序源码能够点击那里下载:链接:
密码: upw2

除此以外附上本身收10的.net Core WebAPI 应用log四net,大家能够看下源码:链接:

密码: gd9b

网站地图xml地图