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