From df18b957515d4739744a60339396247b8cb89a92 Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Tue, 1 May 2018 20:28:08 +0200 Subject: [PATCH] WIP --- ConsoleLogger.cs | 17 +++++ FileLogger.cs | 130 ++++++++++++++++++++++++++++++++++++ LogLevel.cs | 14 ++++ Logger.cs | 50 ++++++++++++++ Logging.cs | 19 ++++++ bin/Debug/sharp.logging.dll | Bin 0 -> 7680 bytes bin/Debug/sharp.logging.pdb | Bin 0 -> 2184 bytes sharp.logging.csproj | 7 +- 8 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 ConsoleLogger.cs create mode 100644 FileLogger.cs create mode 100644 LogLevel.cs create mode 100644 Logger.cs create mode 100644 Logging.cs create mode 100644 bin/Debug/sharp.logging.dll create mode 100644 bin/Debug/sharp.logging.pdb diff --git a/ConsoleLogger.cs b/ConsoleLogger.cs new file mode 100644 index 0000000..c4d261e --- /dev/null +++ b/ConsoleLogger.cs @@ -0,0 +1,17 @@ +using System; +namespace sharp.logging +{ + public class ConsoleLogger : Logger + { + public ConsoleLogger() + { + } + + public override void WriteEntry(string[] entry) + { + foreach (string line in entry){ + Console.WriteLine(line); + } + } + } +} diff --git a/FileLogger.cs b/FileLogger.cs new file mode 100644 index 0000000..5f80837 --- /dev/null +++ b/FileLogger.cs @@ -0,0 +1,130 @@ +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; + +namespace sharp.logging +{ + public class FileLogger : Logger, IDisposable + { + FileStream fileStream; + TextWriter writer; + + bool SendToConsole; + TextWriter stdout, stderr; + + public FileLogger(string filename) + { + openLogFile(filename); + } + + public FileLogger(string filename,bool sendToConsole,bool captureConsole) + { + openLogFile(filename); + SendToConsole = sendToConsole; + + if (SendToConsole || captureConsole){ + stdout = Console.Out; + } + if (captureConsole) + { + stderr = Console.Error; + + 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; + } + } + } + + + } +} diff --git a/LogLevel.cs b/LogLevel.cs new file mode 100644 index 0000000..e531770 --- /dev/null +++ b/LogLevel.cs @@ -0,0 +1,14 @@ +using System; +namespace sharp.logging +{ + public enum LogLevel + { + FATAL = 0, + ERROR = 5, + WARNING = 10, + INFO = 15, + DEBUG = 30, + DEBUGDETAIL = 40, + DEBUGFULL = 80 + } +} diff --git a/Logger.cs b/Logger.cs new file mode 100644 index 0000000..215e546 --- /dev/null +++ b/Logger.cs @@ -0,0 +1,50 @@ +using System; +using System.Diagnostics; +namespace sharp.logging +{ + public abstract class Logger + { + public static Logger DefaultLogger { get; set; } = new ConsoleLogger(); + + public Logger() + { + } + + public void Log(LogLevel level,string message, params object[] args) + { + Log(level,String.Format(message, args)); + } + + public void Log(string message,params object[] args){ + Log(LogLevel.INFO,String.Format(message, args)); + } + + public void Log(string message) + { + Log(LogLevel.INFO, message); + } + public void Log(LogLevel level,string message) + { + string[] lines = message.Split('\n'); + + lines[0] = String.Format("{0} [{1}] [ {3,-10} ] {2}", + DateTime.Now.ToLocalTime(), + Process.GetCurrentProcess().Id, + lines[0], + level.ToString() + ); + + for (int n = 1; n < lines.Length; n++){ + lines[n] = " " + lines[n]; + } + WriteEntry( lines ); + } + + public abstract void WriteEntry(string[] entry); + + public virtual void Close() + { + } + + } +} diff --git a/Logging.cs b/Logging.cs new file mode 100644 index 0000000..88e1027 --- /dev/null +++ b/Logging.cs @@ -0,0 +1,19 @@ +using System; +namespace sharp.logging +{ + public static class Logging + { + public static void Log(string message, params object[] args) + { + Log(LogLevel.INFO, message, args); + } + public static void Log(LogLevel level,string message, params object[] args) + { + Logger.DefaultLogger.Log(level,message, args); + } + + public static void Log(Exception e){ + Log(LogLevel.ERROR,"Exception: {0} / {1}\n{2}", e.GetType().Name, e.Message, e.StackTrace.ToString()); + } + } +} diff --git a/bin/Debug/sharp.logging.dll b/bin/Debug/sharp.logging.dll new file mode 100644 index 0000000000000000000000000000000000000000..66d8aba5c347ec5cf2f6aa131ee6a8129ab03980 GIT binary patch literal 7680 zcmeHLYiu0Xbv}1y_Ms)U;*vHWl4vdUaMqNxq(nK9>lYu(mDi?7gB$;1xCX`atn~#Y@*+XW2EY>5^HiIevQ4O1q6(x>8H$X6DjWr)*`nZcXeB zO`n(~no>Ib*>?s%&>Zbe+MRAw!$jTSL<8;@j-XECH;NxohqSf8Z)ULnQr3XrbJ1z^ zDHi4bjXETmg;Ipw8E%XcJ66Ya&XrHsP+tZUg01ldjU+;P5EXIJle2(;Qb6 z_D!P*m9a3dB#D%8e|FgZ1T>Ao+q5;QZ`U&0h!RADdD3(vlEG3WGBIA(!3Rm(wM{o# zS%-xc_EXnzoSuaXu#_UB=b0U7?(5!__^gwHl|;1LMNfVEGh2n9=>)T_Q)RkPe+-1W zvactD@FtvFnbR+v-e~uWSN8R7Q`ftZS(<|sOI#5buJp9;@1|(ny%R>G@fR~a+(q%8 zGwt!{$1B&3ty>PhsYM;EDx6QyVAg9xbA6sj9#|ZNzg@!`rBP!E;HaMHZrh)V#$Ifv zcm^wnV8nXPw8dca@LPk2Y1cMQ&miJ3I!+nPD2hNiSY|MONITs7;Z9#TN6qPj0cSgV zwy#HX5D_$bH3uu52qQa5&M#$^m?Xse8og+%ngR?;$v zS>keplP=O0JCFhAHs)ZS2G-6)@S>Sr;E=W>ATVuS>an;970 z7?c>@0bej&inLW`-f~^Xu-ik**&}vE(b*fAg*?X=n;MyVgWkXmdTi0zCpK=8G11RX zU=&P+rI`vWhwa-#Y3@Kj&l}S1aq)?%aIUL7|4ca5(5DJ&us7zSFqd|6AI0i^1{yiEU;Kb`9$^1-~T5`mV%v_6b{TRfJYqMq6cl=K$2bg8)aiX2{Ko z(f#ZNOX<##FmO<}npjU(tc@aU34)CjWriV~*iX?x8lQV`T!kkJpHCN$WQVgO!y||8 z0)dsZfoBlBJx>t5iuwp*y=TsME45{hC4K^`6qs)9BLg6iR{mTfIwS-W<4U8|bt33 zg?g@c$=Ijb=$KH!cx_Y+B#HIfXicaWF!~*;ot{~zhEA zue#{eZXW$f`g=sWn=T1;jo6nS`l?VrR3)Kud&Ex}y@$Ro6x+uhfYiYO2C^~@M-9*-EO5SYe z-^Knx#qx|Abpv(!HyJ(P2iE$Gjt)&cX?pcNc*2$=^nThx3x-10@oM)06Lbf#gANJa zB{(Kn5PZMjSwU0qQD79&T`+E?k4U>B_y+xjv4h^Aw~YPt9Hkqdcoj98wc-=dT1VeF8-Y7*_&iShS=Kc=@03wT`cUyVo5J`Mab#;Q|F zEf|;Rs;p_BWZ6~X744IC9YAjfdLP1`yh;yXcejg&R|VUtFY;;luwZ-+{A<$tJbj+N zMM?TSoDXUGCU7tPF)%}a3Oqos0f(Uzrz7;2z@zj%pap)KO7sIY5aI=TOJ$Mqi@+|N zUs>8g9|i8APXPDR7l0#zcMDDkJ|s9N_%MA%jf%AolLyPM3VvR3+t3(4tTXP$d9^?v zq+i1t{0>%EVMiiGsLeRT*`c4q?p4SS1+I=?AMTdt$ynq3A^KEb^=VWnUC3CZ$9j30 zmZiO!7o3DKe$wDFRq_0VLsY2wBZq0(^5;($^GE5P<4(C@TldlFvDxXu^fAg!j-Nb6 z`LW{IRM5^%7RL%q4&L)g8}Vv@LS#Rt+Xuo=RrjZ@AV3Ja9nHS+#P} zX;R)MilZ`ZRxMhBVvQR))3=HhG>XoYQ!;I7pLQ$0HC3rubjL4sjmF0$O@`7#XHM?_`S8^-$&7Hx7L}S*n z%}dhqZdN|wBGXF#%^ed?eZ{RTpKs|pVZz5T*ELuEEAeXGthIE^HflbWi2cCWixs=# zxAaP4O2SOmN=_N6MVxG0d*@BJp0z_N%;?Zs_LSv%2m;F$o#0uH6)A5wyz|_evMyRS z*@BxaWy`iLsR}L2tV%M4&0q|gtTn354Kiyjg&Txs79YV@3A3m?d8uScsOdPC*>VfD zB?pOSnJ!Jhak7zsi;blv%ay@+QfP*W9a5aon|2s^H*xGhku@+`Nm7>re?y{(H~p~r z7^l7)gwu5$2wMK6G_oZhWVR%g=a(%PoxvfItC-6*$MY*CugPjgxw#wWEcariWO?Bp zfFr!mJwn2IyvrsUu4~nNgpcOxNC5G0rs1=HT)`oSslXwg zkVs5Bk70Es(Sq$cS@Yc$!bm`rkyYFvmvLV_OslwUFVi_`r$LS2hB*jc(9ir;It&T5 zC5<-!(VPF6RwY2)S(*vlE?)*L(*oeiBOjcdC1w&n1b{&{w#7Kb)HPzC~2S# z+Cp8X70`=lTd`uBS;w&`712 zOiJ@!JVGXu{X63^qd%D{#ILZQXQo;9XKW-lu4L zc6ze7eo`L@PosPB=84W?@|N{3J}zu?MXoJ8B;rL-Ot5_^@?BCLKf%u#JJEF%-vN)} zd(!M&ZtkV09^H2FlmB?^lkYsa{oAJxJjj|uryRS1J9Q{GR-Bw3!pFOzs#9}@=J>Fj zE1kFaalsuDzYp@+fxSB9EIu+Mw^zV#o~hY-c`@+f{}=vh_)U?$eu3L*Zrxm(-yVaW z`3c9(+4ga>QVSk~EK9Be?tNz;Z18LUFUtRF1o$0ZJ}<9r9wzvDgYP6a@mcNx{LYLL z9mf7|mcu$P{3)8FdEg|?qE*22`!whRFduw%r*9f>Uk{$o6;+@9R3Epw##c`%e01^N zYb`kt3RX>==FJnofOC8a=Qo$V@^oKBuL-V)Q{P;_K}3MQYCI343O@Oesz3@)CgI(& zVW}oE!?>e@zazLY5Chr{O+^zJt%^UsL2yF`hG}<8UtPvu!E8;D3q>eLNk}!v%fW(& zdyf6sxanBdlbg#0H;Xw0H(KB;(S7)mvSH&CY`BmQZb{ZX1f600-b;7lkEs#7$K8cH z7N56Ka`=LvuoCP$>(=0--QwwgKXw-PBOcsf<93Z C27?O# literal 0 HcmV?d00001 diff --git a/bin/Debug/sharp.logging.pdb b/bin/Debug/sharp.logging.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4c3aea84e0fdd3b65a8ac91c8a3bffa710c7bedf GIT binary patch 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{ literal 0 HcmV?d00001 diff --git a/sharp.logging.csproj b/sharp.logging.csproj index f19b15e..4c2dee0 100644 --- a/sharp.logging.csproj +++ b/sharp.logging.csproj @@ -7,7 +7,7 @@ Library sharp.logging sharp.logging - v4.5 + v4.7 true @@ -31,6 +31,11 @@ + + + + + \ No newline at end of file