为ABP框架增加日志组件与依赖注入服务
作者:痴者工良 发布时间:2024-06-05 15:43:32
自动依赖注入
在 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.txt
、Fatal.txt
、logs.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
来源:https://www.cnblogs.com/whuanle/p/13679979.html


猜你喜欢
- 前言入门爬虫很容易,几行代码就可以,可以说是学习 Python 最简单的途径。刚开始动手写爬虫,你只需要关注最核心的部分,也就是先成功抓到数
- [LeetCode] 181.Employees Earning More Than Their Managers 员工挣得比经理多The&
- 好难受,上次发了做游戏的居然没人看,每天为了给你们写啥,老夫心都操碎了~真的是,今天来给大家爬一波短视频网站吧,都是些很养眼的~网站地址在代
- Hadoop 命令行最常用指令篇:1.ls (list directory)Usage:hadoop fs -ls [R]Option: -
- 前言今天无意中发现在python中的一个多重赋值的小问题,自己一开始是比较简单化的理解了这个多重赋值操作的概念,所以导致在一道实现斐波那契数
- 两段使用键盘的上下键进行选择的代码:<Script Language="JScript"> &
- 具体代码如下所述:import sysfrom PySide2.QtGui import *from PySide2.QtCore impo
- 首先,假设我们有如下餐厅数据集:import pandas as pddf = pd.DataFrame({ 'rest
- 基础这个模块是socket的异步实现,让我们先来熟悉一下模块中的一些类和方法:1.asyncore.loop输入一个轮询循环直到通过计数或打
- 最近一直在研究python+selenium+beautifulsoup的爬虫,但是存入数据库还有写入txt文件里面的时候一直都是unico
- 1.安装pyserialhttps://pypi.python.org/pypi/pyserialDoc:http://pythonhost
- 如下所示:alist=[1,2]] >>>[1,2] alist.append([3,4]) >>>[1
- 前言本文主要跟大家介绍了关于Vue实例中生命周期created和mounted区别的相关内容,分享出来供大家参考学习,下面话不多说了,来一起
- 这篇文章主要介绍了sql获取存储过程返回数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 写在最前面:我在研究机器学习的过程中,给的数据集是手写数字图片被处理后的由0,1表达的txt文件,今天写一写关于图片转化为二进制txt文件的
- 这篇文章主要介绍了给Python初学者的一些编程技巧,皆是基于基础的一些编程习惯建议,需要的朋友可以参考下交换变量x = 6y = 5 x,
- 一般情况下,在 golang 中执行一些命令如 git clone,则可以使用 exec.Command 函数func RunCommand
- 一、引言池化技术在Java中应用的很广泛,简而论之,使用对象池存储某个实例数受限制的实例,开发者从对象池中获取实例,使用完之后再换回对象池,
- 如下所示:#!/usr/bin/python#coding:utf-8import MySQLdbimport time,datetime#
- ConfigParser库的使用及遇到的坑背景:这几天想在接口测试中增加logging打印功能,在testerHome正好发现有人分享自己的