前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅入 ABP系列(3):增加日志组件、依赖注入服务

浅入 ABP系列(3):增加日志组件、依赖注入服务

作者头像
痴者工良
发布2021-04-26 10:37:09
9820
发布2021-04-26 10:37:09
举报
文章被收录于专栏:痴者工良痴者工良

目录

  • 自动依赖注入
  • 添加日志依赖
  • 添加日志功能
  • 依赖注入

版权护体©作者:痴者工良,微信公众号转载文章需要 《NCC开源社区》同意。

前面两篇我们搭建了一个基础的、简单的,具有统一响应格式的 Web 程序,这一篇内容不多,继续增加一些需要的组件功能。

前面两篇已经搭建好基架,所以我们可以直接使用基架来逐渐增加功能,本系列后面的篇章会针对多方面的内容来逐渐讲解。

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

基架项目位置在 src/2/AbpBase 里面。

自动依赖注入

AbpBase.WebAbpBaseWebModule 中,添加一个函数:

此函数用于扫描模块中的服务,自动将其加入容器中,这样就不需要收到加入了。

代码语言:javascript
复制
        /// <summary>
        /// 自动扫描所有的服务并进行依赖注入
        /// </summary>
        /// <param name="context"></param>
        private void ConfigureAutoIoc(ServiceConfigurationContext context)
        {
            context.Services.AddAssemblyOf<IoTCenterApplicationModule>();
            context.Services.AddAssemblyOf<IoTCenterWebModule>();
        }

然后在 ConfigureServices 里面,加上

代码语言:javascript
复制
            // 配置依赖注入服务
            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 中,增加一个注入:

代码语言:javascript
复制
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddSingleton<Serilog.ILogger>(Serilog.Log.Logger);
        }

添加日志功能

日志往往要分级、按日期记录等,因此我们这里配置一个简单的分级日志配置。

Program.cs 中,添加一个函数:

代码语言:javascript
复制
        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 后面加上:

代码语言:javascript
复制
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
            .UseAutofac()
            .UseSerilog();

再将 Main 方法改成:

代码语言:javascript
复制
        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;

然后使用以下格式使用注入服务:

代码语言:javascript
复制
        private readonly ILogger _ILogger;

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

完成后,源码可以参考 https://github.com/whuanle/AbpBaseStruct/tree/master/src/3/AbpBase

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自动依赖注入
  • 添加日志依赖
  • 添加日志功能
  • 依赖注入
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档