using Serilog;
using Serilog.Core;
using Serilog.Events;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ips.Library.Basic
{
    public static class SerilogHelper
    {
        public static void BuildLogger(bool usePID)
        {
            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();
        }
    }
    /// 
    /// Serilog日志添加线程ID
    /// 
    public 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));
            }
        }
    }
}