view Implab/Diagnostics/LogChannel.cs @ 48:d9d794b61bb9 interactive logger

Interactive tracing Improved working with tracing contexts
author cin
date Fri, 18 Apr 2014 12:34:45 +0400
parents c2c043520724
children 4c0e5ef99986
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Implab.Diagnostics {
    /// <summary>
    /// Канал, через который публикуются события журнала.
    /// </summary>
    /// <typeparam name="TEvent">Тип событий в канале</typeparam>
    /// <remarks>
    /// Событиями журнала могут быть любые типы, например строки, в которых будет передаваться
    /// информация, или структуры с набором полей, описывающих  важность, текст и другую информацию.
    /// </remarks>
    public class LogChannel<TEvent> {
        static LogChannel<TEvent> _default = new LogChannel<TEvent>();

        /// <summary>
        /// Канал по-умолчанию для событий типа <typeparam name="TEvent"/>.
        /// </summary>
        public static LogChannel<TEvent> Default {
            get {
                return _default;
            }
        }

        /// <summary>
        /// Событие появление новой записи в журнале, на это событие подписываются слушатели.
        /// </summary>
        public event EventHandler<ValueEventArgs<TEvent>> Events;
        
        /// <summary>
        /// Имя канала, полезно для отображения в журнале
        /// </summary>
        public string Name {
            get;
            private set;
        }

        /// <summary>
        /// Создает журнал, имя типа событий назначается в качетве имени канала.
        /// </summary>
        public LogChannel()
            : this(null) {
        }

        /// <summary>
        /// Содает канал с указанным именем.
        /// </summary>
        /// <param name="name">Имя канала.</param>
        public LogChannel(string name) {
            if (String.IsNullOrEmpty(name))
                name = typeof(TEvent).Name;
            Name = name;
        }

        /// <summary>
        /// Отправляет запись журнала через канал подписчикам.
        /// </summary>
        /// <param name="data">Запись журнала.</param>
        /// <remarks>
        /// Контекст трассировки от которого рассылается сообщение определяется автоматически из текущего потока.
        /// </remarks>
        public void LogEvent(TEvent data) {
            var t = Events;
            if (t!= null)
                t(TraceContext.Current,new ValueEventArgs<TEvent>(data));
        }

        /// <summary>
        /// Отправляет запись журнала через канал подписчикам.
        /// </summary>
        /// <param name="data">Запись журнала.</param>
        /// <param name="context">Контекст трассировки от которого рассылается сообщение/</param>
        public void LogEvent(TraceContext context,TEvent data) {
            var t = Events;
            if (t != null)
                t(context, new ValueEventArgs<TEvent>(data));
        }
    }
}