| | |
| | | using System.Text; |
| | | using Serilog.Sinks.SystemConsole.Themes; |
| | | using Serilog.Filters; |
| | | using Autofac.Core; |
| | | using Serilog.Formatting.Json; |
| | | using System.Linq; |
| | | using ZXing; |
| | | using SqlSugar.Extensions; |
| | | |
| | | namespace Utility |
| | | { |
| | | public static class ServiceCollectionExtensions |
| | | { |
| | | internal static string LogFilePath(string fileName) => $@"Logs/{fileName}/{DateTime.Now.Year}.{DateTime.Now.Month}/log_.log"; |
| | | internal static readonly string seriCustomProperty = "seriPos"; |
| | | internal static readonly string logOutputTemplate = "时间: {Timestamp:yyyy-MM-dd HH:mm:ss}{NewLine}来源: {SourceContext}{NewLine}内容: [{Level:u3}] {Message}{NewLine}{Exception}{NewLine}"; |
| | | internal static readonly long? fileSize = 31457280L; |
| | | const string template = "时间: {Timestamp:yyyy-MM-dd HH:mm:ss}{NewLine}来源: {SourceContext}{NewLine}内容: [{Level:u3}] {Message}{NewLine}{Exception}{NewLine}"; |
| | | /// <summary> |
| | | /// 添加配置Serilog |
| | |
| | | public static IServiceCollection AddConfigSerilog(this IServiceCollection services) |
| | | { |
| | | // 创建Serilog记录日志 |
| | | //Log.Logger = new LoggerConfiguration() |
| | | // .MinimumLevel.Debug() |
| | | // .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) |
| | | // .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Fatal) |
| | | // .MinimumLevel.Override("Quartz", LogEventLevel.Warning) |
| | | // .MinimumLevel.Override("Serilog", LogEventLevel.Information) |
| | | // // 全部日志写入到Console |
| | | // .WriteTo.Console() |
| | | // .WriteTo.Async(c => c.Console( |
| | | // theme: AnsiConsoleTheme.Literate, |
| | | // outputTemplate: template)) |
| | | // // Debug日志写入到文件 |
| | | // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug)) |
| | | // .WriteTo.Async(c => c.File( |
| | | // path: "Logs/Debug_.txt", |
| | | // rollingInterval: RollingInterval.Day, |
| | | // fileSizeLimitBytes: 1024 * 1024 * 10, |
| | | // retainedFileCountLimit: 100, |
| | | // outputTemplate: template, |
| | | // restrictedToMinimumLevel: LogEventLevel.Debug)) |
| | | // // Information日志写入到文件 |
| | | // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information)) |
| | | // .WriteTo.Async(c => c.File( |
| | | // path: "Logs/Information_.txt", |
| | | // rollingInterval: RollingInterval.Day, |
| | | // fileSizeLimitBytes: 1024 * 1024 * 10, |
| | | // retainedFileCountLimit: 100, |
| | | // outputTemplate: template, |
| | | // restrictedToMinimumLevel: LogEventLevel.Information)) |
| | | // // Warning日志写入到文件 |
| | | // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning)) |
| | | // .WriteTo.Async(c => c.File( |
| | | // path: "Logs/Warning_.txt", |
| | | // rollingInterval: RollingInterval.Day, |
| | | // fileSizeLimitBytes: 1024 * 1024 * 10, |
| | | // retainedFileCountLimit: 100, |
| | | // outputTemplate: template, |
| | | // restrictedToMinimumLevel: LogEventLevel.Warning)) |
| | | // // Error日志写入到文件 |
| | | // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error)) |
| | | // .WriteTo.Async(c => c.File( |
| | | // path: "Logs/Error_.txt", |
| | | // rollingInterval: RollingInterval.Day, |
| | | // fileSizeLimitBytes: 1024 * 1024 * 10, |
| | | // retainedFileCountLimit: 1000, |
| | | // outputTemplate: template, |
| | | // restrictedToMinimumLevel: LogEventLevel.Error)) |
| | | // .CreateLogger(); |
| | | |
| | | //Log.Logger = new LoggerConfiguration() |
| | | // .Enrich.FromLogContext() |
| | | // .WriteTo.Console() // 输出到控制台 |
| | | // .MinimumLevel.Debug() // 测试最小记录级别 |
| | | // .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => { |
| | | // var result = p.Properties.FirstOrDefault(c => c.Key == "SourceContext").Value; |
| | | // if (result != null) |
| | | // { |
| | | // return result.ToString().Contains("模块名"); |
| | | // } |
| | | // return false; |
| | | // }).WriteTo |
| | | // .File(LogFilePath("模块目录"), rollingInterval: RollingInterval.Day, outputTemplate: template)) |
| | | // .CreateLogger(); |
| | | Log.Logger = new LoggerConfiguration() |
| | | .MinimumLevel.Information() |
| | | .MinimumLevel.Debug() |
| | | .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) |
| | | .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Fatal) |
| | | .MinimumLevel.Override("Quartz", LogEventLevel.Warning) |
| | |
| | | theme: AnsiConsoleTheme.Literate, |
| | | outputTemplate: template)) |
| | | // Debug日志写入到文件 |
| | | //.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug)) |
| | | //.WriteTo.Async(c => c.File( |
| | | // path: "Logs/Debug_.txt", |
| | | // rollingInterval: RollingInterval.Day, |
| | |
| | | // retainedFileCountLimit: 100, |
| | | // outputTemplate: template, |
| | | // restrictedToMinimumLevel: LogEventLevel.Debug)) |
| | | // Information日志写入到文件 |
| | | .WriteTo.Async(c => c.File( |
| | | path: "Logs/Information_.txt", |
| | | rollingInterval: RollingInterval.Day, |
| | | fileSizeLimitBytes: 1024 * 1024 * 10, |
| | | retainedFileCountLimit: 100, |
| | | outputTemplate: template, |
| | | restrictedToMinimumLevel: LogEventLevel.Information)) |
| | | // Warning日志写入到文件 |
| | | .WriteTo.Async(c => c.File( |
| | | path: "Logs/Warning_.txt", |
| | | rollingInterval: RollingInterval.Day, |
| | | fileSizeLimitBytes: 1024 * 1024 * 10, |
| | | retainedFileCountLimit: 100, |
| | | outputTemplate: template, |
| | | restrictedToMinimumLevel: LogEventLevel.Warning)) |
| | | // Error日志写入到文件 |
| | | .WriteTo.Async(c => c.File( |
| | | path: "Logs/Error_.txt", |
| | | rollingInterval: RollingInterval.Day, |
| | | fileSizeLimitBytes: 1024 * 1024 * 10, |
| | | retainedFileCountLimit: 1000, |
| | | outputTemplate: template, |
| | | restrictedToMinimumLevel: LogEventLevel.Error)) |
| | | .WriteTo.Logger(lc => lc |
| | | .Filter.ByIncludingOnly((e) => e.Level == Serilog.Events.LogEventLevel.Information) |
| | | .WriteTo.File("Logs/info/.log", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, fileSizeLimitBytes: 1024 * 1024 * 10)) |
| | | .WriteTo.Logger(lc => lc |
| | | .Filter.ByIncludingOnly((e) => e.Level == Serilog.Events.LogEventLevel.Debug) |
| | | .WriteTo.File("Logs/debug/.log", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, fileSizeLimitBytes: 1024 * 1024 * 10)) |
| | | .WriteTo.Logger(lc => lc |
| | | .Filter.ByIncludingOnly((e) => e.Level == Serilog.Events.LogEventLevel.Error) |
| | | .WriteTo.File("Logs/error/.log", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, fileSizeLimitBytes: 1024 * 1024 * 10)) |
| | | .WriteTo.Logger(lc => lc |
| | | .Filter.ByIncludingOnly((e) => e.Level == Serilog.Events.LogEventLevel.Verbose) |
| | | .WriteTo.File("Logs/verbose/.log", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, fileSizeLimitBytes: 1024 * 1024 * 10)) |
| | | .WriteTo.Logger(lc => lc |
| | | .Filter.ByIncludingOnly((e) => e.Level == Serilog.Events.LogEventLevel.Warning) |
| | | .WriteTo.File("Logs/warning/.log", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, fileSizeLimitBytes: 1024 * 1024 * 10)) |
| | | .WriteTo.Logger(lc => lc |
| | | .Filter.ByIncludingOnly((e) => |
| | | { |
| | | var result = e.Properties.FirstOrDefault(c => c.Key == "ExternalSystems").Value; |
| | | if (result != null) |
| | | { |
| | | return result.ObjToBool(); |
| | | } |
| | | return false; |
| | | }) |
| | | .WriteTo.File("Logs/api/.log", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, fileSizeLimitBytes: 1024 * 1024 * 10)) |
| | | .CreateLogger(); |
| | | |
| | | services.AddSerilog(); |
| | | |
| | | services.AddSerilog(Log.Logger); |
| | | return services; |
| | | } |
| | | } |