在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中。
一、创建最简单的ASP.NET MVC 5应用程序
1、打开VS2015,依次点击【文件】-【新建项目】,创建一个“ASP.NET Web应用程序”,将项目名称命名为“Log4netMVC”,然后点击“确定”按钮。
2、在“选择模板”选项中,我们选择“Empty”模板,在“为以下项添加文件夹和核心引用”选项中勾选“MVC”选项,然后点击“确定”按钮。
3、右击项目中的“Controllers”文件夹,依次点击【添加】-【控制器】,然后选择“MVC 5控制器 - 空”,然后点击“添加”按钮。在弹出的对话框中将控制器名称命名为“HomeController”,然后点击“添加”按钮。
4、双击打开新添加的“HomeController.cs”文件,定位到Index()方法,然后右击该方法名,点击【添加视图】选项,弹出“添加视图”对话框,在该对话框中取消勾选“使用布局页”选项,其他选项保持不变,然后点击“添加”按钮。
5、在Index.cshtml文件中的div元素中添加如下代码:
1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <meta name="viewport" content="width=device-width" /> 10 <title>Index</title> 11 </head> 12 <body> 13 <div> 14 ASP.NET MVC 5中使用log4net! 15 </div> 16 </body> 17 </html>
至此,最简单的一个ASP.NET MVC 5项目创建完毕,项目结构如下所示:
二、在ASP.NET MVC 5项目中配置log4net
1、依次点击【工具】-【NuGet包管理器】-【管理解决方案的NuGet程序包】,然后点击“浏览”标签页,在搜索中输入“log4net”,然后回车,点击搜索到的“log4net”,然后在右侧勾选“Log4netMVC”,版本选择“最新稳定版2.0.5”,然后点击“安装”按钮,等待安装完毕即可。
2、在Log4netMVC项目中展开“Properties”节点,然后双击打开“AssemblyInfo.cs”文件,在该文件的最后添加以下一行代码:
1 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]
3、在Log4netMVC项目的根目录下添加一个名为“Log4net.config”的配置文件,注意该配置文件的名称与第2步中的“ConfigFile”的值一致。将Log4net.config文件配置如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <system.web> 8 <compilation debug="true" targetFramework="4.5.2" /> 9 <httpRuntime targetFramework="4.5.2" /> 10 </system.web> 11 12 <log4net> 13 <!-- 将日志利用ADO.NET记录到数据库中 --> 14 <appender name="AdoNetAppender_SQLServer" type="log4net.Appender.AdoNetAppender"> 15 <!-- 缓冲区大小 --> 16 <bufferSize value="1" /> 17 <!-- 引用信息 --> 18 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 19 <!-- 连接到SQL Server的数据库连接字符串 --> 20 <connectionString value="Data Source=(local); Initial Catalog=Management; User ID=sa; Password=123456;" /> 21 <!-- 插入Log表的SQL语句 --> 22 <commandText value="INSERT INTO dbo.Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 23 24 <parameter> 25 <parameterName value="@log_date" /> 26 <dbType value="DateTime" /> 27 <layout type="log4net.Layout.RawTimeStampLayout" /> 28 </parameter> 29 30 <parameter> 31 <parameterName value="@thread" /> 32 <dbType value="String" /> 33 <size value="255" /> 34 <layout type="log4net.Layout.PatternLayout"> 35 <conversionPattern value="%thread" /> 36 </layout> 37 </parameter> 38 39 <parameter> 40 <parameterName value="@log_level" /> 41 <dbType value="String" /> 42 <size value="50" /> 43 <layout type="log4net.Layout.PatternLayout"> 44 <conversionPattern value="%level" /> 45 </layout> 46 </parameter> 47 48 <parameter> 49 <parameterName value="@logger" /> 50 <dbType value="String" /> 51 <size value="255" /> 52 <layout type="log4net.Layout.PatternLayout"> 53 <conversionPattern value="%logger" /> 54 </layout> 55 </parameter> 56 57 <parameter> 58 <parameterName value="@message" /> 59 <dbType value="String" /> 60 <size value="4000" /> 61 <layout type="log4net.Layout.PatternLayout"> 62 <conversionPattern value="%message" /> 63 </layout> 64 </parameter> 65 66 <parameter> 67 <parameterName value="@exception" /> 68 <dbType value="String" /> 69 <size value="2000" /> 70 <layout type="log4net.Layout.ExceptionLayout" /> 71 </parameter> 72 </appender> 73 74 <root> 75 <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --> 76 <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 --> 77 <!-- 如果没有定义LEVEL的值,则缺省为DEBUG --> 78 <level value="ALL" /> 79 <!-- 将日志利用ADO.NET记录到数据库中 --> 80 <appender-ref ref="AdoNetAppender_SQLServer" /> 81 </root> 82 </log4net> 83 </configuration>
4、双击打开“Log4netMVC”根目录下的Global.asax文件,然后在Application_Start()方法中添加一行代码,最终代码如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using System.Web.Routing; 7 8 namespace Log4netMVC 9 { 10 public class MvcApplication : System.Web.HttpApplication 11 { 12 protected void Application_Start() 13 { 14 AreaRegistration.RegisterAllAreas(); 15 RouteConfig.RegisterRoutes(RouteTable.Routes); 16 17 log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("Log4net.config"))); 18 } 19 } 20 }
5、双击打开“HomeController.cs”文件,编辑代码如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace Log4netMVC.Controllers 8 { 9 public class HomeController : Controller 10 { 11 private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 12 13 // GET: Home 14 public ActionResult Index() 15 { 16 log.Info("ASP.NET MVC Info!"); 17 return View(); 18 } 19 } 20 }
三、创建数据库以及日志表
首先,我们在SQL Server中创建一个名为“Management”的数据库,然后在该数据库中创建一个名为“Log”的表,该表结构如下所示:
1 CREATE TABLE [dbo].[Log]( 2 [Id] [int] IDENTITY(1,1) NOT NULL, 3 [Date] [datetime] NOT NULL, 4 [Thread] [varchar](255) NOT NULL, 5 [Level] [varchar](50) NOT NULL, 6 [Logger] [varchar](255) NOT NULL, 7 [Message] [varchar](4000) NOT NULL, 8 [Exception] [varchar](2000) NULL, 9 CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED 10 ( 11 [Id] ASC 12 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 13 ) ON [PRIMARY]
至此,所有准备工作以及配置工作全部完成,运行该ASP.NET MVC 5应用程序,即可看到日志成功写入到SQL Server数据库。