diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bf793ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# Autosave files +*~ + +# build +[Oo]bj/ +[Bb]in/ +packages/ +TestResults/ + +# globs +Makefile.in +*.DS_Store +*.sln.cache +*.suo +*.cache +*.pidb +*.userprefs +*.usertasks +config.log +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.user +*.tar.gz +tarballs/ +test-results/ +Thumbs.db +.vs/ + +# Mac bundle stuff +*.dmg +*.app + +# resharper +*_Resharper.* +*.Resharper + +# dotCover +*.dotCover diff --git a/ConsoleLogger.cs b/ConsoleLogger.cs index c4d261e..73b99fd 100644 --- a/ConsoleLogger.cs +++ b/ConsoleLogger.cs @@ -1,16 +1,16 @@ using System; namespace sharp.logging { - public class ConsoleLogger : Logger + public class ConsoleLogger : LoggingBackend { public ConsoleLogger() { } - public override void WriteEntry(string[] entry) + protected override void MessageReceived(LogLevel logLevel, string[] lines) { - foreach (string line in entry){ - Console.WriteLine(line); + foreach (string line in lines){ + Logger.SysOut.WriteLine(line); } } } diff --git a/FileLogger.cs b/FileLogger.cs index 5f80837..fdfb2cd 100644 --- a/FileLogger.cs +++ b/FileLogger.cs @@ -1,130 +1,62 @@ using System; using System.IO; -using System.Text; -using System.Collections.Generic; namespace sharp.logging { - public class FileLogger : Logger, IDisposable - { - FileStream fileStream; - TextWriter writer; + public class FileLogger : LoggingBackend, IDisposable + { + FileStream fileStream; + TextWriter writer; - bool SendToConsole; - TextWriter stdout, stderr; + public FileLogger(string filename) + { + openLogFile(filename); + } - public FileLogger(string filename) - { - openLogFile(filename); - } + private void openLogFile(string filename) + { + fileStream = new FileStream(filename, FileMode.Append); + writer = new StreamWriter(fileStream); + } - public FileLogger(string filename,bool sendToConsole,bool captureConsole) - { - openLogFile(filename); - SendToConsole = sendToConsole; + public void Close() + { + if (writer != null) + { + writer.Close(); + fileStream.Close(); + } + } - if (SendToConsole || captureConsole){ - stdout = Console.Out; - } - if (captureConsole) - { - stderr = Console.Error; + public void Dispose() + { + if (writer != null) + { + writer.Close(); + writer.Dispose(); + writer = null; + } + if (fileStream != null) + { + fileStream.Close(); + fileStream.Dispose(); + fileStream = null; + } + } - Console.SetOut( new LoggingWriter(this) ); - Console.SetError( new LoggingWriter(this,LogLevel.ERROR)); - } - - } - - private void openLogFile(string filename) - { - fileStream = new FileStream(filename, FileMode.Append); - writer = new StreamWriter(fileStream); - } - - public override void Close() - { - if (writer != null) - { - writer.Close(); - fileStream.Close(); - } - } - - public void Dispose() - { - if (writer != null) - { - writer.Close(); - writer.Dispose(); - writer = null; - } - if (fileStream != null) - { - fileStream.Close(); - fileStream.Dispose(); - fileStream = null; - } - if (stdout != null){ - Console.SetOut(stdout); - Console.SetError(stderr); - } - } - - public override void WriteEntry(string[] entry) - { - if (writer == null) - { - throw new ObjectDisposedException("FileLogger has already been disposed"); - } - foreach (String line in entry) - { - writer.WriteLine(line); - writer.Flush(); - - if (stdout != null){ - stdout.WriteLine(line); - } - } - } - - class LoggingWriter : TextWriter - { - Logger logger; - LogLevel level; - - List linebuffer = new List(); - - public LoggingWriter(Logger logger,LogLevel level = LogLevel.INFO) - { - this.logger = logger; - this.level = level; - } - - public override void Write(char value) - { - if (value == '\n'){ - logger.Log(level,new String(linebuffer.ToArray())); - linebuffer.Clear(); - } else { - linebuffer.Add(value); - } - } - - public override void WriteLine(string format, params object[] args) - { - logger.Log(level,format,args); - } - - public override Encoding Encoding - { - get - { - return Encoding.UTF8; - } - } - } + protected override void MessageReceived(LogLevel logLevel, string[] lines) + { + if (writer == null) + { + throw new ObjectDisposedException("FileLogger has already been disposed"); + } + foreach (String line in lines) + { + writer.WriteLine(line); + writer.Flush(); + } + } - } + } } diff --git a/ILoggingBackend.cs b/ILoggingBackend.cs new file mode 100644 index 0000000..44eb990 --- /dev/null +++ b/ILoggingBackend.cs @@ -0,0 +1,12 @@ +using System; +using System.Security.Cryptography.X509Certificates; +namespace sharp.logging +{ + public interface ILoggingBackend + { + LogLevel MinLogLevel { get; set; } + LogLevel MaxLogLevel { get; set; } + + void Message(LogLevel logLevel,String[] lines); + } +} diff --git a/LogLevel.cs b/LogLevel.cs index e531770..e763222 100644 --- a/LogLevel.cs +++ b/LogLevel.cs @@ -9,6 +9,7 @@ namespace sharp.logging INFO = 15, DEBUG = 30, DEBUGDETAIL = 40, - DEBUGFULL = 80 + DEBUGFULL = 80, + MAX = 128 } } diff --git a/Logger.cs b/Logger.cs index 215e546..e3903c4 100644 --- a/Logger.cs +++ b/Logger.cs @@ -1,13 +1,35 @@ using System; using System.Diagnostics; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Reflection; namespace sharp.logging { - public abstract class Logger + public class Logger { - public static Logger DefaultLogger { get; set; } = new ConsoleLogger(); + public static ConsoleLogger ConsoleLogger { get; } = new ConsoleLogger(); + public static Logger Default { get; set; } = new Logger(ConsoleLogger); - public Logger() + public static TextWriter SysOut = Console.Out; + public static TextWriter SysError = Console.Error; + + + + public static void CaptureConsole(Logger logger) + { + LoggingWriter outWriter = new LoggingWriter(logger); + Console.SetOut(outWriter); + LoggingWriter errorWriter = new LoggingWriter(logger, LogLevel.ERROR); + Console.SetError(errorWriter); + } + + + public HashSet Backends { get; } = new HashSet(); + + public Logger(ILoggingBackend backend) { + Backends.Add(backend); } public void Log(LogLevel level,string message, params object[] args) @@ -37,14 +59,51 @@ namespace sharp.logging for (int n = 1; n < lines.Length; n++){ lines[n] = " " + lines[n]; } - WriteEntry( lines ); + + Send(level,lines); } - public abstract void WriteEntry(string[] entry); + private void Send(LogLevel logLevel,String[] lines) + { + foreach (ILoggingBackend backend in Backends) + backend.Message(logLevel,lines); + } + + + + + + public void Log(Exception exception) + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendFormat("Exception {0} [{1}]\n", exception.GetType().Name,exception.Message); + + StackTrace stackTrace = new StackTrace(exception, true); + + foreach (StackFrame stackFrame in stackTrace.GetFrames()) + { + MethodBase methodBase = stackFrame.GetMethod(); + MethodBody methodBody = methodBase.GetMethodBody(); + + stringBuilder.AppendFormat(" {0} in {1}:{2}\n", + methodBase.Name, + stackFrame.GetFileName(), + stackFrame.GetFileLineNumber() + ); + //if (methodBody != null) + //{ + // foreach (LocalVariableInfo lvi in methodBody.LocalVariables) + // { + // stringBuilder.AppendFormat(" {0}\n", lvi); + // } + //} + } + + Log(LogLevel.ERROR, stringBuilder.ToString()); + } + + - public virtual void Close() - { - } } } diff --git a/Logging.cs b/Logging.cs index 88e1027..0be8ccd 100644 --- a/Logging.cs +++ b/Logging.cs @@ -9,7 +9,7 @@ namespace sharp.logging } public static void Log(LogLevel level,string message, params object[] args) { - Logger.DefaultLogger.Log(level,message, args); + Logger.Default.Log(level,message, args); } public static void Log(Exception e){ diff --git a/LoggingBackend.cs b/LoggingBackend.cs new file mode 100644 index 0000000..d604964 --- /dev/null +++ b/LoggingBackend.cs @@ -0,0 +1,21 @@ +using System; +namespace sharp.logging +{ + public abstract class LoggingBackend : ILoggingBackend + { + public LogLevel MinLogLevel { get; set; } = LogLevel.FATAL; + public LogLevel MaxLogLevel { get; set; } = LogLevel.MAX; + + public LoggingBackend() + { + } + + public void Message(LogLevel logLevel, string[] lines) + { + if ((logLevel >= MinLogLevel) && (logLevel <= MaxLogLevel)) + MessageReceived(logLevel, lines); + } + + protected abstract void MessageReceived(LogLevel logLevel, String[] lines); + } +} diff --git a/LoggingWriter.cs b/LoggingWriter.cs new file mode 100644 index 0000000..1609f52 --- /dev/null +++ b/LoggingWriter.cs @@ -0,0 +1,47 @@ +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; + +namespace sharp.logging +{ + class LoggingWriter : TextWriter + { + Logger logger; + LogLevel level; + + List linebuffer = new List(); + + public LoggingWriter(Logger logger, LogLevel level = LogLevel.INFO) + { + this.logger = logger; + this.level = level; + } + + public override void Write(char value) + { + if (value == '\n') + { + logger.Log(level, new String(linebuffer.ToArray())); + linebuffer.Clear(); + } + else + { + linebuffer.Add(value); + } + } + + public override void WriteLine(string format, params object[] args) + { + logger.Log(level, format, args); + } + + public override Encoding Encoding + { + get + { + return Encoding.UTF8; + } + } + } +} diff --git a/bin/Debug/sharp.logging.dll b/bin/Debug/sharp.logging.dll index 66d8aba..3e7efa8 100644 Binary files a/bin/Debug/sharp.logging.dll and b/bin/Debug/sharp.logging.dll differ diff --git a/bin/Debug/sharp.logging.pdb b/bin/Debug/sharp.logging.pdb index 4c3aea8..e6ca75b 100644 Binary files a/bin/Debug/sharp.logging.pdb and b/bin/Debug/sharp.logging.pdb differ diff --git a/sharp.logging.csproj b/sharp.logging.csproj index 4c2dee0..e922911 100644 --- a/sharp.logging.csproj +++ b/sharp.logging.csproj @@ -7,7 +7,7 @@ Library sharp.logging sharp.logging - v4.7 + v4.6 true @@ -36,6 +36,9 @@ + + + \ No newline at end of file