using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Serilog.Events; using Serilog; using System; using System.Collections.Generic; 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}"; /// /// 添加配置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.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)) .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(Log.Logger); return services; } } }