123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- 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, params object[] parameters)
- {
- foreach(var logger in Loggers)
- {
- try
- {
- if (parameters?.Any() == true)
- logger.Send(logType, user, String.Format(message, parameters));
- else
- logger.Send(logType, user, message);
- }
- catch (Exception e)
- {
- Logger.Send(LogType.Error, "LOGERROR",
- $"Exception in Logger.Send ({e.Message}) Message=[{message}] ParameterCount={parameters?.Length ?? -1}");
- }
-
- }
- }
- public static void Stop()
- {
- foreach (var logger in Loggers)
- {
- logger.Stop();
- }
- }
- }
- }
|