ABP框架默认的Serilog.Log输出日志会到一个统一的logs.txt文件中,这样我们在定位的错误时候,往往不是很方便,所以,我们可以考虑将日志分类别、日期来存储,以下是优化方案
配置日志保存信息
打开Program.cs类,定位到Main方法,进行重写
public async static Task<int> Main(string[] args)
{
try
{
///上面是你的其它业务逻辑
#region 开始处理日志
Log.Information("Starting Org.NumBd.HttpApi.Host.");
var builder = WebApplication.CreateBuilder(args);
builder.Host.AddAppSettingsSecretsJson()
.UseAutofac()
.UseSerilog((context, loggerConfiguration) =>
{
loggerConfiguration
#if DEBUG
.MinimumLevel.Debug() //日志等级 Fatal > Error > Warning > Information > Debug > Verbose 我们正式环境不显示调试信息
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)//这里把Microsoft日志等级重写成Information,这样就能在生产上显示
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)//这里把Microsoft.EntityFrameworkCore重写成Warning,这样就能在生产上显示
#if DEBUG
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database", LogEventLevel.Debug) //这里把Microsoft.EntityFrameworkCore.Database重写成Debug级别,在调试环境下方便调试
#endif
.Enrich.FromLogContext()
.WriteTo.Console()//输出到控制台
//按日志级别分别写入不同的日志文件中(可设置参数outputTemplate模板,有默认这里就不设置了)
.WriteTo.Logger(configure => configure
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Information)//过滤
.WriteTo.File("Logs/Info/info.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30))
.WriteTo.Logger(configure => configure
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning)//过滤
.WriteTo.File("Logs/Warn/warn.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30))
.WriteTo.Logger(configure => configure
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error)//过滤
.WriteTo.File("Logs/Error/error.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30))
.WriteTo.Logger(configure => configure
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug)//过滤
.WriteTo.File("Logs/Debug/debug.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30))
.WriteTo.Async(c => c.File("Logs/All/logs.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30));
});
#endregion
///下面是其他逻辑
}
catch (Exception ex)
{
if (ex is HostAbortedException)
{
throw;
}
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
注意点
1.我们把日志等级分为下面几个优先级 Fatal > Error > Warning > Information > Debug > Verbose 我们正式环境不显示调试信息
2.这里把Microsoft日志等级重写成Information,这样就能在生产上显示
3.这里把Microsoft.EntityFrameworkCore重写成Warning,这样就能在生产上显示
4.这里把Microsoft.EntityFrameworkCore.Database重写成Debug级别,在调试环境下方便调试
5.因为命名空间的包含关系,后面几个Microsoft顺序不能搞错
6.retainedFileCountLimit:30表示每个类型的日志文件夹下,只能留下30个文件,rollingInterval: RollingInterval.Day表示日志按照时间自动分割
在代码中使用
ABP 仍然使用 ILogger<T>
注入机制。Serilog 会接管这个接口。
public class MyService : ITransientDependency
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public void DoSomething()
{
_logger.LogInformation("这是一个信息日志");
_logger.LogWarning("警告日志");
_logger.LogError("错误日志");
}
}