ln.logging/FileLogger.cs

131 lines
2.3 KiB
C#
Raw Normal View History

2018-05-01 20:28:08 +02:00
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<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;
}
}
}
}
}