| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | using System.Diagnostics;using System.Diagnostics.CodeAnalysis;using System.Text;using H.Pipes;using InABox.Core;namespace InABox.Logging{    public abstract class LoggerBase    {        public LogType[] LogTypes = { LogType.Information, LogType.Query, LogType.Update, LogType.Error, LogType.Important };        protected abstract void DoSend(string message);        public virtual void Send(LogType logType, string user, string message)        {            if (!LogTypes.Any(x => x == logType))                return;            var type = logType switch            {                LogType.Information => "INFO",                LogType.Query => "READ",                LogType.Update => "UPDATE",                LogType.Error => "ERROR",                LogType.Important => "IMPTNT",                _ => "ERROR"            };            var msg = string.Format("{0:HH:mm:ss.fff} {1} {2} {3}",                DateTime.Now,                type?.PadRight(6),                (user ?? "").PadRight(12),                message            );            DoSend(msg);        }        public virtual void Stop() { }    }    public class EventLogger : LoggerBase    {        public Action<string>? OnLog;        public EventLogger(Action<string>? onLog = null)        {            OnLog = onLog;        }        protected override void DoSend(string message)        {            OnLog?.Invoke(message);        }    }    public class ConsoleLogger : LoggerBase    {        public ConsoleLogger()        {            LogTypes = new LogType[] { LogType.Information, LogType.Error };        }        protected override void DoSend(string message)        {            Console.WriteLine(message);        }    }    public class LogFileLogger : LoggerBase    {        private static readonly object logfileLock = new();        private string TmpFolder;        private string _folder;        public string Folder        {            get => _folder;            [MemberNotNull(nameof(_folder), nameof(TmpFolder))]            set            {                _folder = value;                TmpFolder = Path.Combine(Folder, "Temp");                if (Directory.Exists(TmpFolder))                {                    Directory.CreateDirectory(TmpFolder);                    var files = Directory.GetFiles(TmpFolder);                    foreach (var file in files)                        File.Delete(file);                }            }        }        public LogFileLogger(string folder)        {            Folder = folder;        }        public override void Send(LogType logtype, string user, string message)        {            if (logtype == LogType.Update)                UpdateJournal(message);            else                base.Send(logtype, user, message);        }        protected override void DoSend(string message)        {            if (!string.IsNullOrEmpty(Folder))            {                UpdateLogFile(message);            }        }        private void UpdateLogFile(string msg)        {            if (!Directory.Exists(Folder)) Directory.CreateDirectory(Folder);            var filename = Path.Combine(Folder, string.Format("{0:yyyy-MM-dd}.log", DateTime.Today));            try            {                lock (logfileLock)                {                    using (var sw = new StreamWriter(filename, true, Encoding.UTF8, 65536))                    {                        sw.WriteLine(msg);                        sw.Close();                    }                }            }            catch (Exception e)            {                Console.WriteLine("*** Failed to Update Log: " + e.Message);                Console.WriteLine("*** Message: " + msg);            }        }        private void UpdateJournal(string sql)        {            var filename = Path.Combine(Folder, string.Format("{0:yyyy-MM-dd}.sql", DateTime.Today));            try            {                lock (logfileLock)                {                    using (var sw = new StreamWriter(filename, true, Encoding.UTF8, 65536))                    {                        sw.WriteLine(sql);                        sw.Close();                    }                }            }            catch (Exception e)            {                Console.WriteLine("*** Failed to Update SQL Journal: " + e.Message);                Console.WriteLine("*** Message: " + sql);            }        }    }    public class NamedPipeLogger : LoggerBase    {        private PipeServer<string> _pipe;        private string _name = "";        public NamedPipeLogger(string name = "")        {            _name = string.IsNullOrWhiteSpace(name) ? Process.GetCurrentProcess().ProcessName : name;            _pipe = new PipeServer<string>(_name);            _pipe.ClientConnected += _pipe_ClientConnected;            _pipe.StartAsync();        }        private void _pipe_ClientConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<string> e)        {            _pipe.WriteAsync("Connected to " + _name);        }        public override void Stop()        {            _pipe.StopAsync().Wait();        }        protected override void DoSend(string message)        {            if (_pipe != null)                _pipe.WriteAsync(message);        }    }    public static class MainLogger    {        private static List<LoggerBase> Loggers = new();        public static void AddLogger(LoggerBase logger)        {            Loggers.Add(logger);        }        public static void RemoveLogger(LoggerBase logger)        {            Loggers.Remove(logger);        }        public static void Send(LogType logType, string user, string message)        {            foreach(var logger in Loggers)            {                logger.Send(logType, user, message);            }        }        public static void Stop()        {            foreach (var logger in Loggers)            {                logger.Stop();            }        }    }}
 |