I updated the .NET logging system I was working on and posted the source to the downloads page. I ended up changing it to be more flexible with streams, and altered it to use a seperate thread for writing by dequeue-ing items from a queue pool. Here’s some of that:
public void Write(string message, Level level)
{
Message msg = new Message(level, message);
_messageQueue.Enqueue(msg);
}
public void WriteThread()
{
while (_run == true)
{
if (_messageQueue.Count > 0)
{
Message message = _messageQueue.Dequeue();
byte[] messageBytes = message.GetBytes(EncodingType);
foreach (KeyValuePair<level, List<stream>> kv in _outStreams)
{
if (kv.Key.Equals(message.Level))
{
foreach (Stream s in kv.Value)
{
s.Write(messageBytes, 0, messageBytes.Length);
}
}
}
}
}
}
Posted: May 16th, 2010 | Author: benlakey | Filed under: benlakey.com | Tags: .NET, C#, logging, threading | No Comments »
I often need some lightweight logging for projects I’m creating, and I don’t want the cruft of a heavy-duty logging system like NLog or something similar. Today I created a small reusable class for this purpose that I’ll probably add to BGL soon. Here’s what I’ve got so far:
public class Log : IDisposable
{
public enum Level
{
DEBUG,
WARN,
ERROR
}
private bool _disposed = false;
private Dictionary<level, List<stream>> _outStreams;
private List<idisposable> _ourGarbage;
public Encoding EncodingType { get; set; }
public Log()
{
_outStreams = new Dictionary<level, List<stream>>();
EncodingType = new UTF8Encoding();
_ourGarbage = new List<idisposable>();
}
public void AddStreamTarget(Level level, Stream stream)
{
if (_outStreams.ContainsKey(level))
{
if (_outStreams[level].Contains(stream) == false)
{
_outStreams[level].Add(stream);
}
}
else
{
List<stream> lst = new List<stream>();
lst.Add(stream);
_outStreams.Add(level, lst);
}
}
public void AddFileTarget(Level level, string filename)
{
FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
_ourGarbage.Add(fs);
AddStreamTarget(level, fs);
}
public void Write(string message)
{
Write(message, Level.DEBUG);
}
public void Write(string message, Level level)
{
message = DateTime.Now + " " + message + Environment.NewLine;
byte[] messageBytes = EncodingType.GetBytes(message);
foreach (KeyValuePair<level, List<stream>> kv in _outStreams)
{
if (kv.Key.Equals(level))
{
foreach (Stream s in kv.Value)
{
s.Write(messageBytes, 0, messageBytes.Length);
}
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (_disposed == false)
{
if (disposing)
{
foreach (IDisposable garbage in _ourGarbage)
garbage.Dispose();
}
_disposed = true;
}
}
}
Posted: May 15th, 2010 | Author: benlakey | Filed under: benlakey.com | Tags: .NET, C#, logging, NLog | No Comments »