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)
{
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))
.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;
}
}
}