1. 程式人生 > 實用技巧 >淺入 ABP系列(3):增加日誌元件、依賴注入服務

淺入 ABP系列(3):增加日誌元件、依賴注入服務

目錄

版權護體©作者:痴者工良,微信公眾號轉載文章需要 《NCC開源社群》同意。

前面兩篇我們搭建了一個基礎的、簡單的,具有統一響應格式的 Web 程式,這一篇內容不多,繼續增加一些需要的元件功能。

前面兩篇已經搭建好基架,所以我們可以直接使用基架來逐漸增加功能,本系列後面的篇章會針對多方面的內容來逐漸講解。

原始碼地址:https://github.com/whuanle/AbpBaseStruct

基架專案位置在 src/2/AbpBase 裡面。

自動依賴注入

AbpBase.WebAbpBaseWebModule 中,新增一個函式:

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

        /// <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