using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Implab.Diagnostics {
///
/// Канал, через который публикуются события журнала.
///
/// Тип событий в канале
///
/// Событиями журнала могут быть любые типы, например строки, в которых будет передаваться
/// информация, или структуры с набором полей, описывающих важность, текст и другую информацию.
///
public class LogChannel {
static LogChannel _default = new LogChannel();
///
/// Канал по-умолчанию для событий типа .
///
public static LogChannel Default {
get {
return _default;
}
}
///
/// Событие появление новой записи в журнале, на это событие подписываются слушатели.
///
public event EventHandler> Events;
///
/// Имя канала, полезно для отображения в журнале
///
public string Name {
get;
private set;
}
///
/// Создает журнал, имя типа событий назначается в качетве имени канала.
///
public LogChannel()
: this(null) {
}
///
/// Содает канал с указанным именем.
///
/// Имя канала.
public LogChannel(string name) {
if (String.IsNullOrEmpty(name))
name = typeof(TEvent).Name;
Name = name;
}
///
/// Отправляет запись журнала через канал подписчикам.
///
/// Запись журнала.
///
/// Контекст трассировки от которого рассылается сообщение определяется автоматически из текущего потока.
///
public void LogEvent(TEvent data) {
var t = Events;
if (t != null) {
var traceContext = TraceContext.Instance;
t(
this,
new LogEventArgs(
data,
this,
traceContext.ThreadId,
traceContext.CurrentOperation,
traceContext.CurrentOperation.Duration
)
);
}
}
public override string ToString() {
return Name;
}
}
}