master
Harald Christian Joachim Wolff 2018-10-16 21:07:04 +02:00
parent df18b95751
commit ea1dcffc5a
12 changed files with 248 additions and 132 deletions

41
.gitignore vendored 100644
View File

@ -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

View File

@ -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);
}
}
}

View File

@ -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<char> linebuffer = new List<char>();
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();
}
}
}
}
}

12
ILoggingBackend.cs 100644
View File

@ -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);
}
}

View File

@ -9,6 +9,7 @@ namespace sharp.logging
INFO = 15,
DEBUG = 30,
DEBUGDETAIL = 40,
DEBUGFULL = 80
DEBUGFULL = 80,
MAX = 128
}
}

View File

@ -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<ILoggingBackend> Backends { get; } = new HashSet<ILoggingBackend>();
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()
{
}
}
}

View File

@ -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){

21
LoggingBackend.cs 100644
View File

@ -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);
}
}

47
LoggingWriter.cs 100644
View File

@ -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<char> linebuffer = new List<char>();
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;
}
}
}
}

Binary file not shown.

Binary file not shown.

View File

@ -7,7 +7,7 @@
<OutputType>Library</OutputType>
<RootNamespace>sharp.logging</RootNamespace>
<AssemblyName>sharp.logging</AssemblyName>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@ -36,6 +36,9 @@
<Compile Include="Logging.cs" />
<Compile Include="FileLogger.cs" />
<Compile Include="LogLevel.cs" />
<Compile Include="ILoggingBackend.cs" />
<Compile Include="LoggingWriter.cs" />
<Compile Include="LoggingBackend.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>