using System;
using Serilog;
using System.IO;
using Serilog.Events;
using Serilog.Enrichers;
using Serilog.Formatting.Compact;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
namespace SHJX.Service.Common.Logging
{
public static class LogFactory
{
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())//设置基础路径
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)//添加配置文件
.AddEnvironmentVariables()//添加环境变量
.Build();
///
/// 初始化LogFactory的静态成员.
///
static LogFactory()
{
//存储日志文件的格式
string SerilogOutputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} - {ThreadId} - [{Level:u3}] - [{SourceContext}] ----- {Message:lj}{NewLine}{Exception}";
//存储日志文件的路径
static string LogFilePath(string LogEvent) => $@"{AppContext.BaseDirectory}Logs\{LogEvent}\log.log";
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(Configuration)
.MinimumLevel.Debug()
.Enrich.FromLogContext()//使用Serilog.Context.LogContext中的属性丰富日志事件。
.Enrich.With()
.WriteTo.Console(new RenderedCompactJsonFormatter())
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level.Equals(LogEventLevel.Debug)).WriteTo.File(LogFilePath("Debug"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level.Equals(LogEventLevel.Information)).WriteTo.File(LogFilePath("Information"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level.Equals(LogEventLevel.Warning)).WriteTo.File(LogFilePath("Warning"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level.Equals(LogEventLevel.Error)).WriteTo.File(LogFilePath("Error"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level.Equals(LogEventLevel.Fatal)).WriteTo.File(LogFilePath("Fatal"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.CreateLogger();
BuildLogger = (type) =>
{
Microsoft.Extensions.Logging.ILogger logger = new LoggerFactory().AddSerilog(Log.Logger).CreateLogger(type.FullName);
return logger;
};
}
///
/// 获取或设置已配置记录器的日志生成器。
/// 应该调用它来返回一个新的日志实例。
///
public static Func BuildLogger { get; set; }
}
}