From b46e11e2c6286912297492e1c4c41726d00b5df1 Mon Sep 17 00:00:00 2001 From: sheychen Date: Fri, 20 Jan 2017 14:58:41 +0100 Subject: [PATCH] Logger Add Outputs --- MyCommon/Logger.cs | 366 +++++++++++++++++++++++++-------------------- 1 file changed, 203 insertions(+), 163 deletions(-) diff --git a/MyCommon/Logger.cs b/MyCommon/Logger.cs index 5f6886d..20dffa8 100755 --- a/MyCommon/Logger.cs +++ b/MyCommon/Logger.cs @@ -8,190 +8,230 @@ using System.Threading; namespace MyCommon { - public class Logger - { - public enum logType { dev = 0, debug, info, warm, error, fatal } + public class Logger + { + public enum logType { dev = 0, debug, info, warm, error, fatal } - public enum logConsole { normal, show, hide } + public enum logDisplay { normal, show, hide } - public struct Log - { - public string text; - public logType type; - public logConsole console; + public struct Log + { + public string text; + public logType type; + public logDisplay display; - public Log(string p1, logType p2, logConsole p3 = logConsole.normal) - { - text = p1; - type = p2; - console = p3; - } - } + public Log(string p1, logType p2, logDisplay p3 = logDisplay.normal) + { + text = p1; + type = p2; + display = p3; + } + } - private List toWriteLogs = new List(); - private string logPath; - private ConsoleColor[] logBackColor; - private ConsoleColor[] logForeColor; - private Thread Updater; - private logType logLevel = logType.info; - private bool _run = true; - public bool run { get { return _run; } } - private static bool _debug = false; - private static bool _dev = false; + List toWriteLogs = new List(); + string logPath; + ConsoleColor[] logBackColor; + ConsoleColor[] logForeColor; + Thread Updater; + logType logLevel = logType.info; + bool _run = true; + public bool run { get { return _run; } } + static bool _debug = false; + static bool _dev = false; - public enum ConsoleTypes { Any, System, IO }; - private ConsoleTypes consoleType = ConsoleTypes.Any; + List _outList; + public List outList { get { return _outList; } } - /// - /// Create log file and start logger thread - /// - /// Absolute path to logs directory - public void Initialise(string LogPath, ConsoleColor[] backColor, ConsoleColor[] foreColor, logType LogLevel, bool debug, bool dev, ConsoleTypes consoletype = ConsoleTypes.Any) - { - consoleType = consoletype; - logPath = LogPath; - logBackColor = backColor; - logForeColor = foreColor; - logLevel = LogLevel; - _debug = debug; - _dev = dev; - if (!Directory.Exists(logPath)) - { - Directory.CreateDirectory(logPath); - Write("Log Directory Created", logType.info); - } - else - { - //Sort old logs - string[] files = Directory.GetFiles(logPath); + string _outText; + public string outText { get { return _outText; } } - foreach (string file in files) - { - if (Path.GetExtension(file) == ".log") - { - string name = Path.GetFileName(file); - name = name.Substring(0, Math.Min(name.Length, 10)); - if (name.Length == 10) - { - if (name != DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)) - { - int y; - int m; - int d; + public struct Outputs + { + public bool File; + public bool Console; + public bool ConsoleIO; + public bool List; + public bool Text; - if (int.TryParse(new string(name.Take(4).ToArray()), out y) && int.TryParse(new string(name.Skip(5).Take(2).ToArray()), out m) && int.TryParse(new string(name.Skip(8).Take(2).ToArray()), out d)) - { - if (!Directory.Exists(logPath + "/" + y + "/" + m + "/" + d)) - { - Directory.CreateDirectory(logPath + "/" + y + "/" + m + "/" + d); - } - File.Move(file, logPath + "/" + y + "/" + m + "/" + d + "/" + Path.GetFileName(file)); - } - } - } - } - } - } + public Outputs(bool file = true, bool console = false, bool consoleIO = true, bool stringList = false, bool text = false ) + { + File = file; + Console = console; + ConsoleIO = consoleIO; + List = stringList; + Text = text; + } + } - if (consoleType != ConsoleTypes.Any) + Outputs outputs; + + /// + /// Create log file and start logger thread + /// + /// Absolute path to logs directory + public void Initialise(string LogPath, ConsoleColor[] backColor, ConsoleColor[] foreColor, logType LogLevel = logType.info, bool debug = false, bool dev = false, Outputs output = new Outputs()) + { + outputs = output; + logPath = LogPath; + logBackColor = backColor; + logForeColor = foreColor; + logLevel = LogLevel; + _debug = debug; + _dev = dev; + + if (outputs.File) + { + if (!Directory.Exists(logPath)) + { + Directory.CreateDirectory(logPath); + Write("Log Directory Created", logType.info); + } + else + { + //Sort old logs + string[] files = Directory.GetFiles(logPath); + + foreach (string file in files) + { + if (Path.GetExtension(file) == ".log") + { + string name = Path.GetFileName(file); + name = name.Substring(0, Math.Min(name.Length, 10)); + if (name.Length == 10) + { + if (name != DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)) + { + int y; + int m; + int d; + + if (int.TryParse(new string(name.Take(4).ToArray()), out y) && int.TryParse(new string(name.Skip(5).Take(2).ToArray()), out m) && int.TryParse(new string(name.Skip(8).Take(2).ToArray()), out d)) + { + if (!Directory.Exists(logPath + "/" + y + "/" + m + "/" + d)) + { + Directory.CreateDirectory(logPath + "/" + y + "/" + m + "/" + d); + } + File.Move(file, logPath + "/" + y + "/" + m + "/" + d + "/" + Path.GetFileName(file)); + } + } + } + } + } + } + + int i = 0; + while (File.Exists(logPath + "/" + DateTime.UtcNow.ToString("yyyy-MM-dd-", CultureInfo.InvariantCulture) + i + ".log")) { i++; } + logPath = logPath + "/" + DateTime.UtcNow.ToString("yyyy-MM-dd-", CultureInfo.InvariantCulture) + i + ".log"; + Write("Log path:" + logPath, logType.debug); + } + + if (outputs.Console || outputs.ConsoleIO) { Console.BackgroundColor = logBackColor[0]; Console.ForegroundColor = logForeColor[0]; Console.Clear(); } - int i = 0; - while (File.Exists(logPath + "/" + DateTime.UtcNow.ToString("yyyy-MM-dd-", CultureInfo.InvariantCulture) + i + ".log")) { i++; } - logPath = logPath + "/" + DateTime.UtcNow.ToString("yyyy-MM-dd-", CultureInfo.InvariantCulture) + i + ".log"; - Write("Log path:" + logPath, logType.debug); - Updater = new Thread(new ThreadStart(UpdaterLoop)); - Updater.Start(); - } + if (outputs.Text) + { + _outText = ""; + } - public void Join() - { - _run = false; - Updater.Join(); + if (outputs.List) + { + _outList = new List(); + } + + Updater = new Thread(new ThreadStart(UpdaterLoop)); + Updater.Start(); } - public void ChangeLevel(logType level) - { - logLevel = level; - Write("Change to " + logLevel.ToString(), logType.info, logConsole.show); - } + public void Join() + { + _run = false; + Updater.Join(); + } - /// - /// Add log to log pile - /// - /// Log text - /// Log status - /// Server display modifier - public void Write(string text, logType type, logConsole console = logConsole.normal) - { - Write(new Log(text, type, console)); - } + public void ChangeLevel(logType level) + { + logLevel = level; + Write("Change to " + logLevel, logType.info, logDisplay.show); + } - /// - /// Add log to log pile - /// - /// Log struct - private void Write(Log log) - { - if (_debug || _dev) - { - //Add Source Method - log.text = "[" + new StackTrace().GetFrame(2).GetMethod().Name + "]: " + log.text; - } - toWriteLogs.Add(log); - } + /// + /// Add log to log pile + /// + /// Log text + /// Log status + /// Server display modifier + public void Write(string text, logType type, logDisplay console = logDisplay.normal) + { + Write(new Log(text, type, console)); + } - /// - /// Write log pile to logfile and console - /// - public void UpdaterLoop() - { - while (_run || toWriteLogs.Count > 0) - { - while (toWriteLogs.Count > 0) - { - Log log = toWriteLogs[0]; //Saved log -> any lock need - - if (log.type >= logLevel) - { - File.AppendAllText(logPath, DateTime.UtcNow.ToString("[yyyy-MM-dd]", CultureInfo.InvariantCulture) + " [" + log.type.ToString().ToUpper() + "]: " + log.text + Environment.NewLine); - if (log.console != logConsole.hide) - { - ConsoleWrite(log); - } - } - else - { - if (log.console == logConsole.show) - { - ConsoleWrite(log); - } - } - toWriteLogs.Remove(log); - } - } - } - - private void ConsoleWrite(Log log) - { - string text = DateTime.UtcNow.ToString("[yyyy-MM-dd]", CultureInfo.InvariantCulture) + ": " + log.text; - switch (consoleType) + /// + /// Add log to log pile + /// + /// Log struct + void Write(Log log) + { + if (_debug || _dev) { - case ConsoleTypes.System: - Console.ResetColor(); - Console.ForegroundColor = logForeColor[(int)log.type]; - Console.BackgroundColor = logBackColor[(int)log.type]; - Console.WriteLine(text); - break; - - case ConsoleTypes.IO: - ConsoleIO.Write(new ColorStrings(new ColorString(text, logForeColor[(int)log.type], logBackColor[(int)log.type]))); - break; + //Add Source Method + log.text = "[" + new StackTrace().GetFrame(2).GetMethod().Name + "]: " + log.text; } - } - } + toWriteLogs.Add(log); + } + + /// + /// Write log pile to logfile and console + /// + public void UpdaterLoop() + { + while (_run || toWriteLogs.Count > 0) + { + while (toWriteLogs.Count > 0) + { + Log log = toWriteLogs[0]; //Saved log -> any lock need + + if (log.type >= logLevel || log.display == logDisplay.show) + { + string datetime = DateTime.UtcNow.ToString("[yyyy-MM-dd]", CultureInfo.InvariantCulture); + string text = datetime + " [" + log.type.ToString().ToUpper() + "]: " + log.text; + string textfull = datetime + ": " + log.text; + + if (outputs.File && log.type >= logLevel) + { + File.AppendAllText(logPath, textfull + Environment.NewLine); + } + + if (outputs.Console) + { + Console.ResetColor(); + Console.ForegroundColor = logForeColor[(int)log.type]; + Console.BackgroundColor = logBackColor[(int)log.type]; + Console.WriteLine(text); + } + + if (outputs.ConsoleIO) + { + ConsoleIO.Write(new ColorStrings(new ColorString(text, logForeColor[(int)log.type], logBackColor[(int)log.type]))); + } + + if (outputs.List) + { + _outList.Add(textfull); + } + + if (outputs.Text) + { + _outText += textfull + Environment.NewLine; + } + } + + toWriteLogs.Remove(log); + } + } + } + } } \ No newline at end of file