Update: General purpose simplified .NET logging

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: | Filed under: benlakey.com | Tags: , , , | No Comments »

General purpose simplified .NET logging

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: | Filed under: benlakey.com | Tags: , , , | No Comments »