131 lines
2.3 KiB
C#
131 lines
2.3 KiB
C#
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|