笔试考试系统--项目搭建及用Log4Net记录日志
项目架构搭建
一、项目整体采用分层结构,不搞传统的三层架构,直接用Ul+Service (只是根据项目的不同的变体而已,思想上没什么不-样),建ExamOnLine.Common、ExamOnLine.IService、ExamOnLine. Service、ExamOnLine.DTO、 ExamOnLine.Front.Web、ExamOnLine.Admin.Web、 ExamOnLine.UnitTest(单元测试可以后期再搭)
效果如下:
搭建完成后一定不要忘了各个项目之间的引用
UI层也要安装EF 层之间添加引用:
ExamOnLine.Iservice层添加:对DTO层的引用、
ExamOnLine.Service层添加:对ExamOnLine.Iservice、ExamOnLine.ZSZ.DTO的引用
ExamOnLine.ExamOnLine.AdminWeb层添加:ExamOnLine.Iservice、ExamOnLine.Service、ExamOnLine.Common、ExamOnLine..DTO引用
ExamOnLine.Front.Web与ExamOnLine..Admin.Web一样
添加引用步骤如下:
二、配置Log4Net;(前后台都配置)
搭建ExceptionFilter 打印到Log4Net未处理异常;把EF的日志通过Debug方式打印到Log4Net;具开发EF实体部分:然后编写单元测试,确保运行没问题;后面用的时候都下Database .Setlnitializer<XXXDbContext>(null)
(一)先给大家介绍下Log4Net简介:
1:什么是日志,为什么需要记录日志?
2:Log4NET 是一个从 Java 版的 Log4J 移植过来的日志框架,可以简化日志的记录;
3、 Log4NET 的概念:
a) 级别:trace、debug、info、warn、error、fatal。常用 debug(调试信息,程序员临 时跟踪执行,在正式运行的项目中应该不显示);warn(警告);error(错误)。
b) 特殊的级别:all(全部显示);off(全部不显示);
c) appender:可以把日志输出到控制台、文件、数据库、ftp 服务器,甚至可以把日 志输出到邮件、短信等。不同的输出场景就是不同的 appender,可以添加多个 appender,可以设定不同的级别级别使用不同的 appender
(二)Log4Net使用步骤:
1:添加Install-Package Log4NET
2:如果 NuGet 没有给自动配置 App.config,那么就要在<configuration>的<configSections>节点下 新 增 ( 要 在 头 部 ) : <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
3:在webConfig里面添加子节点(在configuration下添加),具体代码如下:
<log4net> <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="DEBUG" /> <appender-ref ref="RollingFileTracer" /> </root> <!-- Print only messages of level DEBUG or above in the packages --> <appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="App_Data/Log/" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Composite" /> <param name="MaxSizeRollBackups" value="10" /> <param name="MaximumFileSize" value="1MB" /> <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net>
4:在程序启动的时候:log4net.Config.XmlConfigurator.Configure();。容易忘,如果发现日志文件一直没有,先想是不是忘了写这句话。
5:记 录 信 息 : ILog logger = LogManager.GetLogger(typeof(WebForm1));
logger.Debug("aaaaaaaaaaaaaa");
6:性能优化: logger.DebugFormat(“hello {0} {}”,"hello")等。 用{n}占位符,而不是字符串拼接,这样如果配置中不输出这个级别的时候,就不会进行字符串拼接,提升性能。
(三)搭建 ExceptionFilter 打印到 Log4Net 记录Action未处理的异常;把 EF 的日志通过Debug 方式打印到 Log4Net,原理如下:
具体配置步骤:
1:新建一个类,在App_Start里面
using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace ExamOnLine.Admin.Web.App_Start { public class ExamOnLineExceptionFilter : IExceptionFilter { private static ILog log = LogManager.GetLogger(typeof(ExamOnLineExceptionFilter));//声明Log4NET对象,建议一个类就声明一个ILog对象 public void OnException(ExceptionContext filterContext) { //只要action出现未处理的异常,这个方法里面都可以捕获到 log.ErrorFormat("出现未处理的异常{0}", filterContext.Exception); } } }
2:在global里面添加 GlobalFilters.Filters.Add(new ZSZExceptionFilter()); //增加自定义异常处理器
using ExamOnLine.Admin.Web.App_Start; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace ExamOnLine.Admin.Web { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { //如果发现日志文件一直没有,先想是不是忘了写这句话。 log4net.Config.XmlConfigurator.Configure(); GlobalFilters.Filters.Add(new ExamOnLineExceptionFilter()); //增加自定义异常处理器 AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } } }
这样就可以了
今天的博文就到这里,明天给大家分享如何配置EF,配置EF;编写实体公共父类