using Serilog; using Serilog.Core; using Serilog.Events; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; namespace XdCxRhDW.Framework { public static class LogHelper { static LogHelper() { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { string path1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AddIns"); string path2 = AppDomain.CurrentDomain.BaseDirectory; string dll1 = Path.Combine(path1, args.Name.Split(',')[0] + ".dll"); string dll2 = Path.Combine(path2, args.Name.Split(',')[0] + ".dll"); if (File.Exists(dll1)) { return Assembly.LoadFrom(dll1); } if (File.Exists(dll2)) { return Assembly.LoadFrom(dll2); } return null; }; } private static bool _hasBuild = false; public static void BuildLogger(bool usePID = true) { string outputTemplate; if (usePID) outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}[线程={ThreadId}][PID={PID}][{Level:u3}]{Message:lj}{NewLine}\t{Exception}"; else outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}[线程={ThreadId}][{Level:u3}]{Message:lj}{NewLine}\t{Exception}"; Serilog.Log.Logger = new Serilog.LoggerConfiguration() .Enrich.FromLogContext() .Enrich.With(new SerilogEnricher(usePID)) .WriteTo.Console(outputTemplate: outputTemplate) .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Information) .WriteTo.File("Logs\\Info\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate)) .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Warning) .WriteTo.File("Logs\\Warning\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate)) .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Error) .WriteTo.File("Logs\\Error\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate)) .CreateLogger(); _hasBuild = true; } public static void Info(string msg) { if (!_hasBuild) BuildLogger(); Serilog.Log.Information(msg); } public static void Warning(string msg, Exception ex = null) { if (!_hasBuild) BuildLogger(); Serilog.Log.Warning(ex, msg); } public static void Error(string msg, Exception ex = null) { if (!_hasBuild) BuildLogger(); Serilog.Log.Error(ex, msg); } } /// /// Serilog日志添加线程ID /// class SerilogEnricher : ILogEventEnricher { private bool useProcessId; private string PID; public SerilogEnricher(bool useProcessId = false) { this.useProcessId = useProcessId; if (useProcessId) { this.PID = Process.GetCurrentProcess().Id.ToString("D5"); } } /// /// 在日志中添加线程ID /// /// /// public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty( "ThreadId", Thread.CurrentThread.ManagedThreadId.ToString("D3"))); if (useProcessId) { logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("PID", PID)); } } } }