• MVC4下配置log4net 五部曲


    第一步:把log4net.dll 编译成Framework 4.0

    第二步:找到项目的Properties下的AssemblyInfo。在最下面添加:[assembly: log4net.Config.XmlConfigurator(Watch = true)]。

    第三步:Web.config

    <configuration>
        <configSections>
        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
        </configSections>
        <log4net>
            <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
                <file value="logs/"/>
                <appendToFile value="true"/>
                <rollingStyle value="Date"/>
                <datePattern value="yyyy-MM-dd.TXT"/>
                <staticLogFileName value="false"/>
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%date ThreadID:[%thread] Log Level:%-5level Class:%logger Desp:%message%newline"/>
                </layout>
            </appender>
            <root>
                <appender-ref ref="LogFileAppender"/>
            </root>
        </log4net>
    </cconfiguration>

    第四步:Global.asax Applicatin_Start方法内添加:ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    第五步:LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType).Error("logtest");

    其它:全局性的 ERROR HANDLER

    [ASP.NET MVC] Error Handling(3) – 全局性的 Error Handler

    现在来看怎么让 HandleErrorAttribute 应用到整个网站?

    只要定义全局性的 Error Handler 就行了。

    在 /App_Start/FilterConfig.cs 里,里面会有一个 RegisterGlobalFilters() Method。
    可以看到里面已经有一行 filters.Add(new HandleErrorAttribute()); 。
    这行是预设的,意思就是他会捕捉到所有 Error,如果你在第一篇文章里,把这一行批注掉,那他无法捕捉 Error,最后就没办法显示我们自定义的 Error Page。

    接着我们把第二章的程序改写在这边。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
          filters.Add(new HandleErrorAttribute
          {
              ExceptionType = typeof(System.Data.DataException),
              View = "DatabaseError"
          });
          
          filters.Add(new HandleErrorAttribute());
    }

    这边要注意的是,他执行的顺序是由上而下的,当上面的 filter 无法捕捉错误 时,才会继续往下执行,而因为我们无法定义所有的错误,所以我们并不会把它默认的那一行程序删除,而是把我们的 filter 加在上面,这样才能确保抓到所有的错误。

    而你也可以手动指定它们执行的顺序,只要加上第二个参数就行了。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
          filters.Add(new HandleErrorAttribute
          {
              ExceptionType = typeof(System.Data.DataException),
              View = "DatabaseError"
          }, 1);
          
          filters.Add(new HandleErrorAttribute(), 2);
    }

    上面虽然写能抓到所有错误,但其实 HandleErrorAttribute 只能抓到 HTTP 500 系列的错误,如果像是 404 这种的就抓不到了,需要再另外定义。

    现在我们把 web.config 的

    <customErrors mode="On">
    </customErrors>
    改成
    <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
       <error statusCode="404" redirect="~/error/notfound"></error>
    </customErrors>


    
    
     有两个重点是

    如果 web.config 有将 custom errors 设成 On,程序里面也有使用 HandleErrorAttribute,那在发生错误时,程序会自动导向到 Error.cshtml。

    (它会在你当前页面的文件夹里寻找是否有 Error.cshtml ,如果找不到才会去 Views/Shared 里面找)

    而忽略掉 customErrors 所设定的 defaultRedirect 跟里面的 <error statusCode="404" redirect="~/errortfound"></error>。 如果 web.config 有将 custom errors 设成 On,程序里面没有使用 HandleErrorAttribute,那在发生错误时,才会导向到 customErrors 所设定的 defaultRedirect 或里面的 <error statusCode="404" redirect="~/errortfound"></error>。

    那如果要测试第二点,是不是要把 HandleErrorAttribute 的程序全删掉?
    当然不用那么麻烦,只要把 Global.asax.cs 里面的 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 批注掉就行了。 
     
  • 相关阅读:
    SQL Server Profiler使用方法
    RichTextBox控件-主要用于输入输出编辑文本信息
    ComboBox
    另一个 SqlParameterCollection 中已包含 SqlParameter
    GUID全局唯一标识符
    MDI-多文档窗体
    【转】classpath和环境变量设置
    接口、抽象类都要单建(好习惯)
    Java基础部分回顾(为自己)
    Java基础——ArrayList与LinkedList(二)
  • 原文地址:https://www.cnblogs.com/fuyu-blog/p/4435426.html
Copyright © 2020-2023  润新知