From ea1dcffc5acb9f5d176f6bea07b65a64b9a06a68 Mon Sep 17 00:00:00 2001 From: Harald Christian Joachim Wolff Date: Tue, 16 Oct 2018 21:07:04 +0200 Subject: [PATCH] Upgrades --- .gitignore | 41 +++++++++ ConsoleLogger.cs | 8 +- FileLogger.cs | 166 +++++++++++------------------------- ILoggingBackend.cs | 12 +++ LogLevel.cs | 3 +- Logger.cs | 75 ++++++++++++++-- Logging.cs | 2 +- LoggingBackend.cs | 21 +++++ LoggingWriter.cs | 47 ++++++++++ bin/Debug/sharp.logging.dll | Bin 7680 -> 9216 bytes bin/Debug/sharp.logging.pdb | Bin 2184 -> 2928 bytes sharp.logging.csproj | 5 +- 12 files changed, 248 insertions(+), 132 deletions(-) create mode 100644 .gitignore create mode 100644 ILoggingBackend.cs create mode 100644 LoggingBackend.cs create mode 100644 LoggingWriter.cs 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 66d8aba5c347ec5cf2f6aa131ee6a8129ab03980..3e7efa8560c6c2a8bed202cc0b68302b3b2b54b1 100644 GIT binary patch literal 9216 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 C27?O# diff --git a/bin/Debug/sharp.logging.pdb b/bin/Debug/sharp.logging.pdb index 4c3aea84e0fdd3b65a8ac91c8a3bffa710c7bedf..e6ca75bc7e62fa254ecb162a87b3fb2498fc587c 100644 GIT binary patch literal 2928 zcmZuzTWnNC82)F@*|U3gyWO@dTkb3^v`|YaTCAc4-L~9ofl?3+mt}h>tJ|Kk7qJm# zDcV$szJLCi`EN7R zSjW7WAVK^q0v5K!q7O~2tG5KC(MEK-fXankYgl#_s8zuqgT9Ao9e8C&Hl6J4&Y(+K z$S_QmogMTr`n*u(?9RC@Xpexu2UNyVCNHMF+O#M%p{Q+N-|ij19$S9k%dgJe4>2tp zyI51Csy=%m7$k;k3M`4+sJZz;n6fAM|Yp>2+H`Ti}_!9@Ua7&FwhZq48o&#lOP%IB;G>frNiNu3@~udED#brQkjnF9X+IoMY^F z@m&t*9TVt}2Lc%PIQ!k{;w9+w`b8MmobjCw_krJr{!EAK;7#aH2ZGQKIQn(q#jv=* zxpqP>KEcJgj@bSZj2Aic+5S=&XPe4g{C4mm@UWoI_J&}uxsD?)z7o9L#pk;? z$9gO<8Xg55d${h$xcCA~=b!Nic+@q{wax1k=5s!IjRI$%D_xw&IVbM%3GlbTM`EnX z#jC;j$94-V8+?|y=B8K@fiKZitIx4l5go2D-a{ik_R{iEvA(>l;yX#biti)pS)97d z3aJXs^qj>PeWEq-#Dhj}7iF^OEJ?=`hTWZ&j`tXpO7g#J3&Ai~f zRJyZ+&bA+rFCJOEDtCU@>DCjcqA#rfdht8tU23LsJx0ber@gJUBd{)>j;Fddn5ngE zl}tLJ_L#lquneSqljD7TsbnIaO`5%vGe-I$BOSB{Qf7BI?9~^bHPUs7jDHFVJv4Ic z_@?>cRlhy8;#%O!eHA;z$!V2`Um8_A{R0lT8klA^MHB62vewa`$r?Rnc2n1qjCc2% znQStV8R3YU%~Z-r@cx;)*+#FCP9}6`Xl{GJ=`ArH&Xzj;#l~7^LYc^K7x`Txe^BJl zi2VB^|H)XCjtJ|58l+FB5fVi=OX98>!#yGUJz})TZ?%jY)i44Uj~Uezpel7ZkLCnL zWEe#&d-%kP@wmn(%5Z2>1V+VemSN>FhR;PPlHMeNiX(8 z$oD>;&C#;ankYzlv_-{zu>!|Np)y|v*O2Vd1@;+ODF-@hP+g)KK6s^1!1g&PS&8#L z-$zloK_|IsItm%uYNM)!L};-J{Wj>|EPWcSmN@#ishH>G>oP(usD6p-q#d`VGzCrJ z$lM}HSD{r!Vpu<7rjlGWL!-K?=3;2|hdE5|dIzMAr;Yy`V&D+JszU-Z{4`vy4^f?3 z?Z=L!APFVS$ex)p25TiSSSyeBh2Q>Y!H(3SJ(1kT*Dm#CK0MVrYikupFQO?Nbr^|H z1J0}nAbMVjN7O_0a7y9=POuX-0tsA&+fsJhwmw>et6l5Vyqc~F&CmOyR#Bv`jeiaw zf8yhlyWcpsf9vm=i(mW_e0jr@*Y{d!^J1S0CvBF1H%6w}cRTf=DnV;yQzHbMG^@M#B3o4g*A@~XA zwXkpz4P}M0K?N-6ks+BsiozmM|L-;DNnZdpgq?592G>wITOS%UjmxK>Q{rzA$dEUG zSkE68`NKta;H;B*u*6A{ebe2Lsx8ll6E~mN-+K1X>wS9lk@g?2MO#}}9O74OQcw?2 zvuYh)xG_}vyc`niEZ@pei@@wMuKR+gIQSKVQG@r^Az*V0L9`NHiD^;k3$wHY2Sn5a zt<|k0$%rU*tc}^1{0-)AjfKNnzJL4!_ukT$+!lLo?^i2!pJ|9&mx{)zBvq@m8n4Z~ owS3bQYt!%-0@rl8I_aOn9|lcP40G;~zTxb}I6j|3uE&(W0TNh(0ssI2 literal 2184 zcmZuyZETZO6h8O7Z{L@;Tf4PgHyE-y28=0n#L1$F$Tk?8C}U+1jf{=1+nRJOTen5z zV;>3{NdzOt#P|atMkN~mn4k#~&`3-)0of1si(tgWA4C)Rp%Rn%oZEK1s7;>t-sjwN z&(}Towkg)$q)3tcihz!mrpWl}XuTGYMF%h$1eSL6?Gf2cV3xrT5uG!LN@OiII+9Ee zWM%z($V`!S#pnv=VrXe=S6hoLV&PR_X;UgA#!ep|_K%;q-FjkfYSERQ54L|dTlbu( z?W{WGcEg86RRh>SDX+Th%A?xp692ZLMp$Pb(~_e5}tdA^-58@VmgcQD~w&NsD~M=-9Q333cL$^0-OgfW4HLMz>XU1*bVGe23-Sw z0sc}Zjj>5bft$b`V3}dk+kj=7v>fOGhD`~!a4r_+xmIibY8$96P5%8dcuLKV{_+jue2TwZq{g|%E^Ix`?|s<0d+eJx&Tste^T=DnKX-mf_Kr+yY$%a+wQShF@fjmK5;uo3 z>5MNn*gLW}79ULXjinMJ#aW@NQkj7P+;sOAjERwGJnMdll-nPySn){c$Nd#EY41l{ zw=Ft;t0O(PukM3qXCzD0uFVartk}NnXksXk8=@`A-hp%`JDQAVO_fqv-3D&MCR`e{ zHtW7nK0{G0hx`x>iG~U^Dyrwo5(p-=pd1>DnLQ$S0(DoF5G-R3xEf6AAh*wh1{RZe z=vOMAz8)f#111<0`SJcnz8g=gZV`*Qe9H0 zN|C9$}`*`x|9`u}g>favQB}>~x^7l3l zXLJRM$uG8oCi+P~o;eqVauk|sSeh!(qrcaN)ap1fRz3a#uhz0_ptOiW?KrO z6I&y-O5#r`fNJEklS$o8f-b66TQ9s00^Iz39>o^s#eT H-pYRfE-nE{ 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