笔试考试系统--项目搭建及用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="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
      <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;编写实体公共父类

posted @ 2020-07-15 18:26  JuneDream  阅读(222)  评论(0编辑  收藏  举报