Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
GlobalLogger.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 using System.Text.RegularExpressions;
6 
7 namespace SiliconStudio.Core.Diagnostics
8 {
9  /// <summary>
10  /// A logger that redirect messages to a global handler and handle instantiated MapModuleNameToLogger.
11  /// </summary>
12  public sealed class GlobalLogger : Logger
13  {
14  #region Constants and Fields
15 
16  /// <summary>
17  /// By default, the minimum level for a GlobalLogger is info.
18  /// </summary>
19  public const LogMessageType MinimumLevel = LogMessageType.Info;
20 
21  /// <summary>
22  /// Map for all instantiated loggers. Map a module name to a logger.
23  /// </summary>
24  private static readonly Dictionary<string, Logger> MapModuleNameToLogger = new Dictionary<string, Logger>();
25 
26  #endregion
27 
28  private GlobalLogger(string module)
29  {
30  Module = module;
31  }
32 
33  public delegate void MessageFilterDelegate(ref ILogMessage logMessage);
34 
35  /// <summary>
36  /// Occurs before a message is logged.
37  /// </summary>
38  public static event MessageFilterDelegate GlobalMessageFilter;
39 
40  /// <summary>
41  /// Occurs when a message is logged.
42  /// </summary>
43  public static event Action<ILogMessage> GlobalMessageLogged;
44 
45  /// <summary>
46  /// Gets all registered loggers.
47  /// </summary>
48  /// <value>The registered loggers.</value>
49  public static Logger[] RegisteredLoggers
50  {
51  get
52  {
53  lock (MapModuleNameToLogger)
54  {
55  var loggers = new Logger[MapModuleNameToLogger.Count];
56  MapModuleNameToLogger.Values.CopyTo(loggers, 0);
57  return loggers;
58  }
59  }
60  }
61 
62  /// <summary>
63  /// Activates the log for all loggers using the specified action..
64  /// </summary>
65  /// <param name="activator">The activator.</param>
66  /// <exception cref="ArgumentNullException">If activator is null</exception>
67  public static void ActivateLog(Action<Logger> activator)
68  {
69  if (activator == null)
70  throw new ArgumentNullException("activator");
71 
72  foreach (var logger in MapModuleNameToLogger.Values)
73  activator(logger);
74  }
75 
76  /// <summary>
77  /// Activates the log for loggers that match a regex pattern on the module name.
78  /// </summary>
79  /// <param name="regexPatternModule">The regex pattern to match a module name.</param>
80  /// <param name="minimumLevel">The minimum level.</param>
81  /// <param name="maximumLevel">The maximum level.</param>
82  /// <param name="enabledFlag">if set to <c>true</c> enaable the log, else disable.</param>
83  /// <exception cref="ArgumentNullException">If regexPatternModule is null</exception>
84  public static void ActivateLog(string regexPatternModule, LogMessageType minimumLevel, LogMessageType maximumLevel = LogMessageType.Fatal, bool enabledFlag = true)
85  {
86  if (regexPatternModule == null)
87  throw new ArgumentNullException("regexPatternModule");
88 
89  var regex = new Regex(regexPatternModule);
90  ActivateLog(regex, minimumLevel, maximumLevel);
91  }
92 
93  /// <summary>
94  /// Activates the log for loggers that match a regex pattern on the module name.
95  /// </summary>
96  /// <param name="regexPatternModule">The regex pattern to match a module name.</param>
97  /// <param name="minimumLevel">The minimum level.</param>
98  /// <param name="maximumLevel">The maximum level.</param>
99  /// <param name="enabledFlag">if set to <c>true</c> enaable the log, else disable.</param>
100  /// <exception cref="ArgumentNullException">If regexPatternModule is null</exception>
101  public static void ActivateLog(Regex regexPatternModule, LogMessageType minimumLevel, LogMessageType maximumLevel = LogMessageType.Fatal, bool enabledFlag = true)
102  {
103  if (regexPatternModule == null)
104  throw new ArgumentNullException("regexPatternModule");
105 
106  ActivateLog(
107  logger =>
108  {
109  if (regexPatternModule.Match(logger.Module).Success)
110  {
111  logger.ActivateLog(minimumLevel, maximumLevel, enabledFlag);
112  }
113  });
114  }
115 
116  /// <summary>
117  /// Gets the <see cref="GlobalLogger"/> associated to the specified module.
118  /// </summary>
119  /// <param name="module">The module name.</param>
120  /// <exception cref="ArgumentNullException">If module name is null</exception>
121  /// <returns>An instance of a <see cref="Logger"/></returns>
122  public static Logger GetLogger(string module)
123  {
124  if (module == null)
125  throw new ArgumentNullException("module");
126 
127  Logger logger;
128  lock (MapModuleNameToLogger)
129  {
130  if (!MapModuleNameToLogger.TryGetValue(module, out logger))
131  {
132  logger = new GlobalLogger(module);
133  logger.ActivateLog(MinimumLevel);
134  MapModuleNameToLogger.Add(module, logger);
135  }
136  }
137  return logger;
138  }
139 
140  protected override void LogRaw(ILogMessage logMessage)
141  {
142  var filterHandler = GlobalMessageFilter;
143  if (filterHandler != null)
144  {
145  filterHandler(ref logMessage);
146  if (logMessage == null)
147  return;
148  }
149 
150  var handler = GlobalMessageLogged;
151  if (handler != null) handler(logMessage);
152  }
153  }
154 }
static Logger GetLogger(string module)
Gets the GlobalLogger associated to the specified module.
static Action< ILogMessage > GlobalMessageLogged
Occurs when a message is logged.
Definition: GlobalLogger.cs:43
static void ActivateLog(Action< Logger > activator)
Activates the log for all loggers using the specified action..
Definition: GlobalLogger.cs:67
Base implementation for ILogger.
Definition: Logger.cs:10
static void ActivateLog(Regex regexPatternModule, LogMessageType minimumLevel, LogMessageType maximumLevel=LogMessageType.Fatal, bool enabledFlag=true)
Activates the log for loggers that match a regex pattern on the module name.
LogMessageType
Type of a LogMessage.
override void LogRaw(ILogMessage logMessage)
Internal method used to log a message. All Info, Debug, Error...etc. methods are calling this method...
static MessageFilterDelegate GlobalMessageFilter
Occurs before a message is logged.
Definition: GlobalLogger.cs:38
The base interface for log messages used by the logging infrastructure.
Definition: ILogMessage.cs:8
A logger that redirect messages to a global handler and handle instantiated MapModuleNameToLogger.
Definition: GlobalLogger.cs:12
static void ActivateLog(string regexPatternModule, LogMessageType minimumLevel, LogMessageType maximumLevel=LogMessageType.Fatal, bool enabledFlag=true)
Activates the log for loggers that match a regex pattern on the module name.
Definition: GlobalLogger.cs:84