using System; using Microsoft.Extensions.Logging; using Serilog; public sealed class Logger { private static readonly Lazy _instance = new Lazy(() => new Logger()); private static ILoggerFactory _loggerFactory; private static readonly object _lock = new object(); public static Logger Default => _instance.Value; private Logger() { var logConfig = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}"); _loggerFactory = LoggerFactory.Create(builder => { builder.AddSerilog(logConfig.CreateLogger(), dispose: true); }); } public void ToConsole() { // 不需要处理,Serilog 默认就输出到控制台 } public void ToFile(string filename) { var logConfig = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}") .WriteTo.File(filename, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}"); lock (_lock) { _loggerFactory.Dispose(); _loggerFactory = LoggerFactory.Create(builder => { builder.AddSerilog(logConfig.CreateLogger(), dispose: true); }); } } public void Info(string message) { _loggerFactory.CreateLogger().LogInformation(message); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(message); Console.ResetColor(); } public void Warn(string message) { _loggerFactory.CreateLogger().LogWarning(message); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(message); Console.ResetColor(); } public void Error(string message) { _loggerFactory.CreateLogger().LogError(message); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(message); Console.ResetColor(); } }