LogChannel.cs
85 lines
| 3.3 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r36 | using System; | ||
using System.Collections.Generic; | ||||
using System.Linq; | ||||
using System.Text; | ||||
namespace Implab.Diagnostics { | ||||
cin
|
r48 | /// <summary> | ||
/// Канал, через который публикуются события журнала. | ||||
/// </summary> | ||||
/// <typeparam name="TEvent">Тип событий в канале</typeparam> | ||||
/// <remarks> | ||||
/// Событиями журнала могут быть любые типы, например строки, в которых будет передаваться | ||||
/// информация, или структуры с набором полей, описывающих важность, текст и другую информацию. | ||||
/// </remarks> | ||||
cin
|
r36 | public class LogChannel<TEvent> { | ||
static LogChannel<TEvent> _default = new LogChannel<TEvent>(); | ||||
cin
|
r48 | /// <summary> | ||
/// Канал по-умолчанию для событий типа <typeparam name="TEvent"/>. | ||||
/// </summary> | ||||
cin
|
r36 | public static LogChannel<TEvent> Default { | ||
get { | ||||
return _default; | ||||
} | ||||
} | ||||
cin
|
r48 | /// <summary> | ||
/// Событие появление новой записи в журнале, на это событие подписываются слушатели. | ||||
/// </summary> | ||||
cin
|
r92 | public event EventHandler<LogEventArgs<TEvent>> Events; | ||
cin
|
r48 | /// <summary> | ||
/// Имя канала, полезно для отображения в журнале | ||||
/// </summary> | ||||
public string Name { | ||||
get; | ||||
private set; | ||||
} | ||||
cin
|
r36 | |||
cin
|
r48 | /// <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> | ||||
cin
|
r36 | public void LogEvent(TEvent data) { | ||
var t = Events; | ||||
cin
|
r92 | if (t != null) { | ||
var traceContext = TraceContext.Instance; | ||||
t( | ||||
this, | ||||
new LogEventArgs<TEvent>( | ||||
data, | ||||
cin
|
r194 | this, | ||
cin
|
r92 | traceContext.ThreadId, | ||
traceContext.CurrentOperation, | ||||
traceContext.CurrentOperation.Duration | ||||
) | ||||
); | ||||
} | ||||
cin
|
r37 | } | ||
cin
|
r194 | |||
public override string ToString() { | ||||
return Name; | ||||
} | ||||
cin
|
r36 | } | ||
} | ||||