EaseFilter Demo Project
EventManager.cs
Go to the documentation of this file.
1 //
3 // (C) Copyright 2012 EaseFilter Technologies Inc.
4 // All Rights Reserved
5 //
6 // This software is part of a licensed software product and may
7 // only be used or copied in accordance with the terms of that license.
8 //
10 
11 using System;
12 using System.Collections;
13 using System.Collections.Generic;
14 using System.Text;
15 using System.Threading;
16 using System.IO;
17 using System.Diagnostics;
18 using System.Globalization;
19 
20 
21 namespace EaseFilter.CommonObjects
22 {
23  public enum EventLevel
24  {
25  Off = 0,
26  Error = 1,
27  Warning = 2,
28  Information = 3,
29  Verbose = 4,
30  Trace = 5,
31  }
32 
33  public enum EventOutputType
34  {
35  EventView = 0,
36  File,
37  Console,
39  NamedPipe,
40  DbgView,
41  }
42 
43 
44  public class MessageEventArgs : EventArgs
45  {
47  string message = string.Empty;
48  string callerName = string.Empty;
49  int eventId = 0;
50  DateTime time = DateTime.MinValue;
51 
52  public MessageEventArgs(int eventId, string callerName, EventLevel eventType, string message,DateTime messageTime)
53  {
54  this.eventType = eventType;
55  this.message = message;
56  this.callerName = callerName;
57  this.eventId = eventId;
58  this.time = messageTime;
59  }
60 
61  public DateTime Time
62  {
63  get { return time; }
64  set { time = value; }
65  }
66 
67  public EventLevel Type
68  {
69  get { return eventType; }
70  set { eventType = value; }
71  }
72 
73  public string Message
74  {
75  get { return message; }
76  set { message = value; }
77  }
78 
79  public string CallerName
80  {
81  get { return callerName; }
82  set { callerName = value; }
83  }
84 
85  public int EventID
86  {
87  get { return eventId; }
88  set { eventId = value; }
89  }
90 
91  }
92 
93 
94  public static class EventManager
95  {
96  public delegate void ShowNotificationDlgt(string message, bool isErrorMessage);
97  public static ShowNotificationDlgt showNotificationDlgt = null;
98 
99  public delegate void MessageEventDlgt(MessageEventArgs messageEventArg);
100 
101  static event MessageEventDlgt messageEventHandler;
102  static EventLevel level = GlobalConfig.EventLevel;
104  static string logFileName = GlobalConfig.EventLogFileName;
105  static string eventSource = GlobalConfig.EventSource;
106  static string eventLogName = GlobalConfig.EventLogName;
107  static EventLog eventLog = null;
108  // static string PipeName = "MessagePipe";
109 
110  static AutoResetEvent autoEvent = new AutoResetEvent(false);
111  static Queue<MessageEventArgs> messageQueue = new Queue<MessageEventArgs>();
112  static Thread eventThread = null;
113 
114  public static AutoResetEvent logFileSyncEvent = new AutoResetEvent(true);
115 
116  static System.Reflection.Assembly assembly = System.Reflection.Assembly.GetEntryAssembly();
117  public static string locallAssemblyPath = Path.GetDirectoryName(assembly.Location);
118 
119  static char taskStringSeperator = '|';
120 
121  public static string FormatDateTime(DateTime date)
122  {
123  return date.ToString("yyyy-MM-ddTHH:mm:ss.fff");
124  }
125 
126  static EventManager()
127  {
128  if (eventThread == null)
129  {
130  eventThread = new Thread(new ThreadStart(ProcessMessage));
131  eventThread.Name = "EventManagerProcessThread";
132  eventThread.Start();
133  }
134  }
135 
136  public static void WriteMessage(int eventId, string callerName, EventLevel evnetType, string message)
137  {
138  if (evnetType > level)
139  {
140  return;
141  }
142 
143  MessageEventArgs messageEventArgs = new MessageEventArgs(eventId, callerName, evnetType, message,DateTime.Now);
144 
145  lock(messageQueue)
146  {
147  messageQueue.Enqueue(messageEventArgs);
148  }
149 
150  autoEvent.Set();
151 
152  }
153 
154  public static string EventSource
155  {
156  get { return eventSource; }
157  set { eventSource = value; }
158  }
159 
160  public static string EventLogName
161  {
162  get { return eventLogName; }
163  set { eventLogName = value; }
164  }
165 
166  public static void Stop()
167  {
168 
169  autoEvent.Set();
170 
171  }
172 
173  public static MessageEventDlgt MessageEventHandler
174  {
175  get { return messageEventHandler; }
176  set { messageEventHandler = value; }
177  }
178 
179  public static EventLevel Level
180  {
181  get { return level; }
182  set { level = value; }
183  }
184 
185  public static EventOutputType Output
186  {
187  get { return output; }
188  set { output = value; }
189  }
190 
191  public static string LogFileName
192  {
193  get { return logFileName; }
194  set { logFileName = value; }
195  }
196 
197  private static void SendMessageToNamedpipe(MessageEventArgs messageEventArg)
198  {
199  try
200  {
201 
202 
203  }
204  catch
205  {
206 
207  }
208  }
209 
210  private static string ConvertEventArgToSring(MessageEventArgs messageEventArg)
211  {
212  string text = FormatDateTime(messageEventArg.Time)
213  + taskStringSeperator + messageEventArg.Type
214  + taskStringSeperator + messageEventArg.EventID
215  + taskStringSeperator + messageEventArg.CallerName
216  + taskStringSeperator + messageEventArg.Message;
217 
218  return text;
219  }
220 
221 
222  public static MessageEventArgs ConvertSringToEventArg(string message)
223  {
224  string[] strs = message.Split(new char[] { taskStringSeperator });
225 
226  if (strs.Length < 5)
227  {
228  //the log message didn't log complete message, skip
229  return null;
230  }
231 
232  DateTime time = DateTime.ParseExact(strs[0], "yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture);
233  EventLevel type = (EventLevel)Enum.Parse(typeof(EventLevel), strs[1]);
234  int id = int.Parse(strs[2]);
235  string callerName = strs[3];
236  string txt = strs[4];
237 
238  MessageEventArgs messageArg = new MessageEventArgs(id,callerName,type,txt,time);
239 
240  return messageArg;
241  }
242 
243  private static void SendMessageToFile(MessageEventArgs messageEventArg)
244  {
245  try
246  {
247  string logFileFullPath = Path.Combine(locallAssemblyPath, logFileName);
248 
249  if (File.Exists(logFileFullPath))
250  {
251  FileInfo fileInfo = new FileInfo(logFileFullPath);
252 
253  if (fileInfo.Length > GlobalConfig.MaxEventLogFileSize)
254  {
255  if (File.Exists(logFileFullPath + ".1"))
256  {
257  File.Delete(logFileFullPath + ".1");
258  }
259 
260  File.Move(logFileFullPath, logFileFullPath + ".1");
261  }
262  }
263 
264 
265  EventManager.logFileSyncEvent.WaitOne();
266 
267  string text = ConvertEventArgToSring(messageEventArg).Replace("\n", "") + Environment.NewLine;
268  File.AppendAllText(logFileFullPath, text);
269 
270  EventManager.logFileSyncEvent.Set();
271 
272  if (null != showNotificationDlgt)
273  {
274  showNotificationDlgt(messageEventArg.Message, messageEventArg.Type < EventLevel.Warning);
275  }
276 
277  }
278  catch (Exception ex)
279  {
280  throw (ex);
281  }
282  }
283 
284  private static void SendMessageToEventView(MessageEventArgs messageEventArg)
285  {
286 
287  try
288  {
289  string text = DateTime.Now.ToString("G")
290  + ":" + messageEventArg.Type
291  + ":" + messageEventArg.CallerName
292  + ":" + messageEventArg.Message;
293 
294  if (null == eventLog)
295  {
296  if (!EventLog.SourceExists(eventSource))
297  {
298  EventLog.CreateEventSource(eventSource, eventLogName);
299  }
300 
301  eventLog = new EventLog(eventLogName, ".", eventSource);
302  }
303 
304  switch (messageEventArg.Type)
305  {
306  case EventLevel.Error:
307  case EventLevel.Warning:
308  eventLog.WriteEntry(messageEventArg.Message + "\n\n Caller:" + messageEventArg.CallerName
309  , (EventLogEntryType)messageEventArg.Type, messageEventArg.EventID);
310  break;
311 
312  case EventLevel.Information:
313  case EventLevel.Verbose:
314  eventLog.WriteEntry(messageEventArg.Message + "\n\n Caller:" + messageEventArg.CallerName
315  , EventLogEntryType.Information, messageEventArg.EventID);
316  break;
317  }
318  }
319 
320  catch (Exception ex)
321  {
322  throw (ex);
323  }
324  }
325 
326 
327  static void PrintWarning(string info)
328  {
329  ConsoleColor oldColor = Console.ForegroundColor;
330  Console.ForegroundColor = ConsoleColor.Yellow;
331  Console.WriteLine(info);
332  Console.ForegroundColor = oldColor;
333  }
334 
335  static void PrintError(string info)
336  {
337  ConsoleColor oldColor = Console.ForegroundColor;
338  Console.ForegroundColor = ConsoleColor.Red;
339  Console.WriteLine(info);
340  Console.ForegroundColor = oldColor;
341  }
342 
343  private static void SendMessageToConsole(MessageEventArgs messageEventArg)
344  {
345  try
346  {
347  string text = "Id:" + messageEventArg.EventID
348  + ":" + messageEventArg.CallerName + Environment.NewLine
349  + messageEventArg.Message + Environment.NewLine;
350 
351  if (messageEventArg.Type == EventLevel.Error)
352  {
353  PrintError(text);
354  }
355  else if (messageEventArg.Type == EventLevel.Warning)
356  {
357  PrintWarning(text);
358  }
359  else
360  {
361  Console.WriteLine(text);
362  }
363  }
364  catch (Exception ex)
365  {
366  throw (ex);
367  }
368  }
369 
370  private static void ProcessMessage()
371  {
372  WaitHandle[] waitHandles = new WaitHandle[] { autoEvent , GlobalConfig.StopEvent };
373 
374  while (GlobalConfig.IsRunning)
375  {
376  if (messageQueue.Count == 0)
377  {
378  int result = WaitHandle.WaitAny(waitHandles);
379 
380  if (!GlobalConfig.IsRunning)
381  {
382  return;
383  }
384  }
385 
386  MessageEventArgs message = null;
387 
388  lock( messageQueue)
389  {
390  if( messageQueue.Count > 0)
391  {
392  message = messageQueue.Dequeue();
393  }
394  }
395 
396  if (message == null)
397  {
398  continue;
399  }
400 
401  try
402  {
403  switch (output)
404  {
405  case EventOutputType.EventView: SendMessageToEventView(message); break;
406  // case EventOutputType.File: SendMessageToFile(message); break;
407  case EventOutputType.Console: SendMessageToConsole(message); break;
408  case EventOutputType.CallbackDelegate: messageEventHandler(message); break;
409  case EventOutputType.NamedPipe: SendMessageToNamedpipe(message); break;
410  // case EventOutputType.MessageView: messageForm.AddMessageToEventView(message); break;
411  case EventOutputType.DbgView: System.Diagnostics.Debug.WriteLine(ConvertEventArgToSring(message)); break;
412  }
413  }
414  catch (Exception ex)
415  {
416  Console.WriteLine("Log message exception:" + ex.Message + ".\r\nMessage:" + message);
417  }
418 
419  try
420  {
421  SendMessageToFile(message);
422  }
423  catch (Exception ex)
424  {
425  Console.WriteLine("Write message exception:" + ex.Message + ".\r\nMessage:" + message);
426  }
427  }
428  }
429  }
430 }
static ManualResetEvent StopEvent
MessageEventArgs(int eventId, string callerName, EventLevel eventType, string message, DateTime messageTime)
Definition: EventManager.cs:52
ULONG eventType
Definition: FilterAPI.h:584
static EventOutputType EventOutputType

Social Network


Services Overview

Architect, implement and test file system filter drivers for a wide range of functionality. We can offer several levels of assistance to meet your specific.

Contact Us

You are welcome to contact us for salse or partnership.

Sales: sales@easefilter.com
Support: support@easefilter.com
Info: info@easefilter.com