36
|
1 using System;
|
|
2 using System.Collections.Generic;
|
|
3 using System.Linq;
|
|
4 using System.Text;
|
|
5
|
|
6 namespace Implab.Diagnostics {
|
48
|
7 /// <summary>
|
|
8 /// Канал, через который публикуются события журнала.
|
|
9 /// </summary>
|
|
10 /// <typeparam name="TEvent">Тип событий в канале</typeparam>
|
|
11 /// <remarks>
|
|
12 /// Событиями журнала могут быть любые типы, например строки, в которых будет передаваться
|
|
13 /// информация, или структуры с набором полей, описывающих важность, текст и другую информацию.
|
|
14 /// </remarks>
|
36
|
15 public class LogChannel<TEvent> {
|
|
16 static LogChannel<TEvent> _default = new LogChannel<TEvent>();
|
|
17
|
48
|
18 /// <summary>
|
|
19 /// Канал по-умолчанию для событий типа <typeparam name="TEvent"/>.
|
|
20 /// </summary>
|
36
|
21 public static LogChannel<TEvent> Default {
|
|
22 get {
|
|
23 return _default;
|
|
24 }
|
|
25 }
|
|
26
|
48
|
27 /// <summary>
|
|
28 /// Событие появление новой записи в журнале, на это событие подписываются слушатели.
|
|
29 /// </summary>
|
92
|
30 public event EventHandler<LogEventArgs<TEvent>> Events;
|
|
31
|
48
|
32 /// <summary>
|
|
33 /// Имя канала, полезно для отображения в журнале
|
|
34 /// </summary>
|
|
35 public string Name {
|
|
36 get;
|
|
37 private set;
|
|
38 }
|
36
|
39
|
48
|
40 /// <summary>
|
|
41 /// Создает журнал, имя типа событий назначается в качетве имени канала.
|
|
42 /// </summary>
|
|
43 public LogChannel()
|
|
44 : this(null) {
|
|
45 }
|
|
46
|
|
47 /// <summary>
|
|
48 /// Содает канал с указанным именем.
|
|
49 /// </summary>
|
|
50 /// <param name="name">Имя канала.</param>
|
|
51 public LogChannel(string name) {
|
|
52 if (String.IsNullOrEmpty(name))
|
|
53 name = typeof(TEvent).Name;
|
|
54 Name = name;
|
|
55 }
|
|
56
|
|
57 /// <summary>
|
|
58 /// Отправляет запись журнала через канал подписчикам.
|
|
59 /// </summary>
|
|
60 /// <param name="data">Запись журнала.</param>
|
|
61 /// <remarks>
|
|
62 /// Контекст трассировки от которого рассылается сообщение определяется автоматически из текущего потока.
|
|
63 /// </remarks>
|
36
|
64 public void LogEvent(TEvent data) {
|
|
65 var t = Events;
|
92
|
66 if (t != null) {
|
|
67 var traceContext = TraceContext.Instance;
|
|
68 t(
|
|
69 this,
|
|
70 new LogEventArgs<TEvent>(
|
|
71 data,
|
134
|
72 Name,
|
92
|
73 traceContext.ThreadId,
|
|
74 traceContext.CurrentOperation,
|
|
75 traceContext.CurrentOperation.Duration
|
|
76 )
|
|
77 );
|
|
78 }
|
37
|
79 }
|
36
|
80 }
|
|
81 }
|