asp.net core使用 log4net全局日志處理


一、引用類庫:

  1、 Microsoft.Extensions.Logging.Log4Net.AspNetCore

  2、log4net.AspNetCore

二、配置 log4net.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
        </layout>
    </appender>
    <!--指定日記記錄方式,以滾動文件的方式(文件記錄)-->
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <!--日志路徑-->
        <file value="log\log.txt" />
        <!--是否是向文件中追加日志-->
        <appendToFile value="true" />
        <!--log保留天數-->
        <param name= "MaxSizeRollBackups" value= "10"/>
        <!--每個文件最大3M-->
        <param name="maximumFileSize" value="3MB" />
        <!--日志根據日期滾動-->
        <param name="RollingStyle" value="Date" />
        <!--日志文件名格式為:logs_20080831.log-->
        <param name="DatePattern" value="&quot;logs_&quot;yyyyMMdd&quot;.log&quot;" />
        <!--日志文件名是否是固定不變的-->
        <param name="StaticLogFileName" value="false" />
        <!--布局-->
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
        </layout>
    </appender>
    <root>
        <level value="ALL"/>
        <appender-ref ref="DebugAppender" />
        <appender-ref ref="RollingFile" />
    </root>
</log4net>

三、創建自己的 MyExceptionFilterAttribute並繼承 ExceptionFilterAttribute 該抽象類,依賴注入日志對象 logger

public class MyExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly ILogger<MyExceptionFilterAttribute> _logger;        
        /// <summary>
        /// 通過構造函數的方式,依賴注入日志對象
        /// </summary>
        /// <param name="logger"></param>
        public MyExceptionFilterAttribute(ILogger<MyExceptionFilterAttribute> logger)
        {
            this._logger = logger;
        }
        public override void OnException(ExceptionContext context)
        {
            // 判斷是否被處理過
            if (!context.ExceptionHandled)
            {
                context.ExceptionHandled = true;
                var str = $"異常:{context.HttpContext.Request.Path}{context.Exception.Message}";
                // 輸出到控制台
                Console.WriteLine(str);
                // 寫入文本日志(或者是記錄到數據庫等....)
                _logger.LogWarning(str);
                if (context.HttpContext.Request.Method == "GET")
                {
                    // 如果是 get請求,則跳轉頁面
                }
                else
                {
                    // 如果是post 則都是ajax請求,則返回json數據格式,輸出自定義或者約定好的格式
                    context.Result = new JsonResult(new { Result = false, Message = "請求出現錯誤,請聯系管理員" });
                }
            }
        }
    }

四、在Program.cs配置使用log4net

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureLogging((context, loggingBuilder) =>
            {
                loggingBuilder.AddFilter("System", LogLevel.Warning);
                loggingBuilder.AddFilter("Microsoft", LogLevel.Warning);
                // 使用log4net
                loggingBuilder.AddLog4Net();
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

五、在Startup.cs ConfigureServices方法里面注冊全局Filters錯誤日志處理

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews(options=> 
            {
                // 全局注冊,全局生效
                options.Filters.Add(typeof(MyExceptionFilterAttribute));
            });
        }

這樣系統都可以統一處理異常。避免代碼中到處都是try catch,開發人員多,寫出來的日志格式等不統一,錯誤日志漏處理等現象。


免責聲明!

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



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