為ABP框架增加日志組件與依賴註入服務

自動依賴註入

在 AbpBase.Web 的 AbpBaseWebModule 中,添加一個函數:

此函數用於掃描模塊中的服務,自動將其加入容器中,這樣就不需要收到加入瞭。

        /// <summary>
        /// 自動掃描所有的服務並進行依賴註入
        /// </summary>
        /// <param name="context"></param>
        private void ConfigureAutoIoc(ServiceConfigurationContext context)
        {
            context.Services.AddAssemblyOf<IoTCenterApplicationModule>();
            context.Services.AddAssemblyOf<IoTCenterWebModule>();
        }

然後在 ConfigureServices 裡面,加上

            // 配置依賴註入服務
            ConfigureAutoIoc(context);

這些模塊中繼承瞭 ITransientDependency 接口的類型都會被自動註入到 DI 容器中。

添加日志依賴

ABP 中,封裝瞭 Serilog 作為日志組件,大傢可以在 AbpBase.Web 項目 中使用 Nuget 安裝 Volo.Abp.AspNetCore.Serilog 包,版本為 3.1.2。

因為 Web 是最上層部分,Volo.Abp.AspNetCore.Serilog 已經封裝好瞭,但是功能還不夠多,所以我們還需要需要繼續添加 Serilog 提供的拓展。

由於 AbpBase.Application 模塊是服務提供模塊,也是要使用到日志功能的,所以我們需要在 AbpBase.Application 中,用 Nuget 添加 兩個包:

Serilog.AspNetCore 包,版本 3.4.0;

Serilog.Sinks.Async 包,版本 1.4.0 ;

然後在 AbpBaseApplicationModule 中,增加一個註入:

        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddSingleton<Serilog.ILogger>(Serilog.Log.Logger);
        }

添加日志功能

日志往往要分級、按日期記錄等,因此我們這裡配置一個簡單的分級日志配置。

在 Program.cs 中,添加一個函數:

        private static void ConfigLog()
        {
            Serilog.Log.Logger = new LoggerConfiguration()
#if DEBUG
                .MinimumLevel.Debug()
#else
                .MinimumLevel.Information()
#endif
                .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
                .Enrich.FromLogContext()
                .WriteTo.Async(c => c.File($"Logs/{DateTime.Now.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture)}-logs.txt"))
                .WriteTo.Logger(log =>
                        log.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Fatal)
                            .WriteTo.File(
                                $"Logs/{(DateTime.Now.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) + "-Fatal.txt")}",
                                fileSizeLimitBytes: 83886080),
                    LogEventLevel.Fatal)
                .WriteTo.Logger(log =>
                        log.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Error)
                            .WriteTo.File(
                                $"Logs/{(DateTime.Now.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) + "-Error.txt")}",
                                fileSizeLimitBytes: 83886080),
                    LogEventLevel.Fatal)
                .WriteTo.Console()
                .CreateLogger();
        }

這個函數中配置瞭 Seriolg 日志輸出,我們將日志分成 Error.txtFatal.txtlogs.txt 三個等級,還設置按日期新建日志文件,並且每個日志文件最大為 8 MB。

讀者可以根據情況自行調整。

然後在 CreateHostBuilder 後面加上:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
            .UseAutofac()
            .UseSerilog();

再將 Main 方法改成:

        public static int Main(string[] args)
        {
            try
            {
                ConfigLog();
                Serilog.Log.Information("Starting web host.");
                CreateHostBuilder(args).Build().Run();
                return 0;
            }
            catch (Exception ex)
            {
                Serilog.Log.Fatal("Host terminated unexpectedly!");
                return 1;
            }
            finally
            {
                Serilog.Log.CloseAndFlush();
            }
        }

之後我們將可以獲得一個帶有日志功能的 Web 程序瞭。

依賴註入

如果你需要使用日志服務,則可以引用 using Serilog;

然後使用以下格式使用註入服務:

        private readonly ILogger _ILogger;

        public CustomerExceptionHandler(ILogger logger)
        {
            _ILogger = logger;
        }

完成後,源碼可以參考 https://github.com/whuanle/AbpBaseStruct/tree/master/src/3/AbpBase

源碼地址:https://github.com/whuanle/AbpBaseStruct

到此這篇關於為ABP框架增加日志組件與依賴註入服務的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: