ln.logging/ln.logging/Logger.cs

112 lines
3.2 KiB
C#

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Reflection;
namespace ln.logging
{
public class Logger
{
public static ConsoleLogger ConsoleLogger { get; } = new ConsoleLogger();
public static Logger Default { get; set; } = new Logger(ConsoleLogger);
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 Logger(Stream logStream)
{
Backends.Add(new FileLogger(logStream));
}
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];
}
Send(level,lines);
}
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());
}
}
}