AspNetCore 使用log4net+IExceptionFilter 記錄錯誤日志


錯誤日志的好處我就不說了,大家都心里有數,那今天浩子就給大家說一說基本的錯誤日志吧這次通過log4net記錄日志。

原來寫過一個關於Nlog的日志框架,傳送門為:https://www.cnblogs.com/ZaraNet/p/9957655.html 

使用呢,直接nuget log4net吧,這個就不多說了,那我們看一下如何使用。

1.創建log4net.config

2.配置Startup.

3.定義HttpGlobalExceptionFilter

在根目錄創建log4net.config,其定義如下:

 

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=1B44E1D426115821" />
  </configSections>
  <log4net>
    <root>
      <!--<level value="DEBUG"/>-->
      <level value="ERROR"/>
      <!--根據log級別記錄到不同的日志文件-->
      <!--<appender-ref ref="DebugLog" />-->
      <appender-ref ref="ErrorLog" />
    </root>
    <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
      <!-- 最后放開注釋-->
      <span style="font-family: Arial, Helvetica, sans-serif;">
        <!--<lockingModel type="命名空間.MinimalLockDeleteEmpty" />-->
      </span>
      <param name="File" value="Log\" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd.'log'" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <securityContext type="log4net.Util.WindowsSecurityContext">
        <credentials value="Process" />
      </securityContext>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR" />
        <levelMax value="ERROR" />
      </filter>
    </appender>
  </log4net>
</configuration>

 

  在Startup.cs定義如下,記得引用相應的命名空間。

public static ILoggerRepository repository { get; set; }

public Startup(IConfiguration configuration)
{
    Configuration = configuration;

    //加載log4net日志配置文件
    repository = LogManager.CreateRepository("NETCoreRepository");
    XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{

    services.AddMvc(options =>
    {
        options.Filters.Add<Models.HttpGlobalExceptionFilter>(); //加入全局異常類
    });
}  

控制器方面:

 

 public class IndexController : Controller
    {
        private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HttpGlobalExceptionFilter));
        public IActionResult Index()
        {
            log.Error("哎喲我去");
            return View();
        }
    }

 

那我們可以看到呢,我們的日志已經生成好了,但是有經驗的人都應該知道,這個如果你不記錄錯誤的話,你也是每天創建一個這樣的文件,那么我們應該怎么辦呢?看了一下國內的網站,還沒有對這個有針對性的解決方案,但我們可以最low的定義一個計時器,來找到為空的日志文件,如果它是為空的我們就刪除它。

你可以自己搞個任務調度的框架去完成這個需求,當然在這里我還是非常推薦使用Quertz的。你自己去看一下它是不是0kb就完事了,Quertz文章傳送門:https://www.cnblogs.com/ZaraNet/p/9962786.html.

 

public IActionResult Index()
        {
       try{} 
        catch{
        ..
        }           
     return View();
        }    

 

  回歸正題,我們想一想,在一般的控制器中,每次進行邏輯業務的時候,都需要try,catch嗎? 我們可以這樣耦合度就太大了,所以我們最好通過全局filter。

 

public class HttpGlobalExceptionFilter : IExceptionFilter
    {
        private ILog log = LogManager.GetLogger(Startup.repository.Name,typeof(HttpGlobalExceptionFilter));
        /// <summary>
        /// 當系統發生未捕捉的異常時就會觸發這個方法
        /// </summary>
        /// <param name="context">context是上下文,包含了錯誤異常信息</param>
        public void OnException(ExceptionContext context)
        {
            log.Error("哎呀呀我是菜雞");
        }
    }

 你還可以自己定義記錄格式:

  public static void ErrorLog(string throwMsg, Exception ex)
        {
            string errorMsg = string.Format("【拋出信息】:{0} <br>【異常類型】:{1} <br>【異常信息】:{2} <br>【堆棧調用】:{3}", new object[] { throwMsg,
                ex.GetType().Name, ex.Message, ex.StackTrace });
            errorMsg = errorMsg.Replace("\r\n", "<br>");
            errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");
            logerror.Error(errorMsg);
        }

  繼承IExceptionFilter接口,在你程序報錯的時候就會走到這里,所以你可以在這里完成一些操作去配合日志框架,我們還需要去注冊服務

 public void ConfigureServices(IServiceCollection services)
        {
             ....///
               services.AddMvc(options =>
            {
                options.Filters.Add<Filter.HttpGlobalExceptionFilter>();//全局異常類
            });
        }       

  之后你就直接在OnException中直接進行寫入就好了。今天就說到這里吧。嘿嘿!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM