Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
Logger.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 
5 namespace SiliconStudio.Core.Diagnostics
6 {
7  /// <summary>
8  /// Base implementation for <see cref="ILogger"/>.
9  /// </summary>
10  public abstract partial class Logger : ILogger
11  {
12  protected readonly bool[] EnableTypes;
13 
14  /// <summary>
15  /// Occurs when a message is logged.
16  /// </summary>
17  public event EventHandler<MessageLoggedEventArgs> MessageLogged;
18 
19  /// <summary>
20  /// Initializes a new instance of the <see cref="Logger" /> class.
21  /// </summary>
22  protected Logger()
23  {
24  EnableTypes = new bool[(int)LogMessageType.Fatal + 1];
25  }
26 
27  /// <summary>
28  /// Gets the minimum level enabled from the config file.
29  /// </summary>
30  public static readonly LogMessageType MinimumLevelEnabled = LogMessageType.Info; // AppConfig.GetConfiguration<LoggerConfig>("Logger").Level;
31 
32  /// <summary>
33  /// True if the debug level is enabled at a global level
34  /// </summary>
35  public static readonly bool IsDebugEnabled = MinimumLevelEnabled <= LogMessageType.Debug;
36 
37  /// <summary>
38  /// True if the verbose level is enabled at a global level
39  /// </summary>
40  public static readonly bool IsVerboseEnabled = MinimumLevelEnabled <= LogMessageType.Verbose;
41 
42  /// <summary>
43  /// Gets or sets a value indicating whether this instance has errors.
44  /// </summary>
45  /// <value><c>true</c> if this instance has errors; otherwise, <c>false</c>.</value>
46  public bool HasErrors { get; set; }
47 
48  /// <summary>
49  /// Gets the module name. read-only.
50  /// </summary>
51  /// <value>The module name.</value>
52  public string Module { get; internal protected set; }
53 
54  /// <summary>
55  /// Activates the log for this logger for a range of <see cref="LogMessageType"/>.
56  /// </summary>
57  /// <param name="fromLevel">The lowest inclusive level to log for.</param>
58  /// <param name="toLevel">The highest inclusive level to log for.</param>
59  /// <param name="enabledFlag">if set to <c>true</c> this will enable the log, false otherwise. Default is true.</param>
60  /// <remarks>
61  /// Outside the specified range the log message type are disabled (!enabledFlag).
62  /// </remarks>
63  public void ActivateLog(LogMessageType fromLevel, LogMessageType toLevel = LogMessageType.Fatal, bool enabledFlag = true)
64  {
65  // From lower to higher, so we keep fromLevel < toLevel
66  if (fromLevel > toLevel)
67  {
68  var temp = fromLevel;
69  fromLevel = toLevel;
70  toLevel = temp;
71  }
72 
73  for (int i = 0; i < EnableTypes.Length; i++)
74  EnableTypes[i] = (i >= (int)fromLevel && i <= (int)toLevel) ? enabledFlag : !enabledFlag;
75  }
76 
77  /// <summary>
78  /// Activates the log for this logger for a specific <see cref="LogMessageType"/>.
79  /// </summary>
80  /// <param name="type">The type.</param>
81  /// <param name="enabledFlag">if set to <c>true</c> [enabled flag].</param>
82  /// <remarks>
83  /// All other activated type are leaved intact.
84  /// </remarks>
85  public void ActivateLog(LogMessageType type, bool enabledFlag)
86  {
87  EnableTypes[(int)type] = enabledFlag;
88  }
89 
90  /// <summary>
91  /// Returns a boolean indicating if a particular <see cref="LogMessageType"/> is activated.
92  /// </summary>
93  /// <param name="type">The type.</param>
94  /// <returns>True if the log is activated, otherwise false.</returns>
95  public bool Activated(LogMessageType type)
96  {
97  return EnableTypes[(int)type];
98  }
99 
100  public void Log(ILogMessage logMessage)
101  {
102  if (logMessage == null)
103  throw new ArgumentNullException("logMessage");
104 
105  // Even if the type is not enabled, set HasErrors property
106  // This allow to know that there is an error even if is is not logger.
107  if (logMessage.Type == LogMessageType.Error || logMessage.Type == LogMessageType.Fatal)
108  HasErrors = true;
109 
110  // Only log when a particular type is enabled
111  if (EnableTypes[(int)logMessage.Type])
112  {
113  LogRaw(logMessage);
114  var handler = MessageLogged;
115  if (handler != null)
116  {
117  handler(this, new MessageLoggedEventArgs(logMessage));
118  }
119  }
120  }
121 
122  /// <summary>
123  /// Internal method used to log a message. All Info, Debug, Error...etc. methods are calling this method.
124  /// </summary>
125  /// <param name="logMessage">The log message.</param>
126  protected abstract void LogRaw(ILogMessage logMessage);
127 
128  /// <summary>
129  /// Extracts the caller info from a variable parameters.
130  /// </summary>
131  /// <param name="parameters">The parameters.</param>
132  /// <returns>A caller info or null if there is no caller information available.</returns>
133  internal static CallerInfo ExtractCallerInfo(object[] parameters)
134  {
135  return (parameters.Length > 0) ? parameters[parameters.Length - 1] as CallerInfo : null;
136  }
137  }
138 }
EventHandler< MessageLoggedEventArgs > MessageLogged
Occurs when a message is logged.
Definition: Logger.cs:17
A class to store Caller Information attributes.
Definition: CallerInfo.cs:10
void ActivateLog(LogMessageType fromLevel, LogMessageType toLevel=LogMessageType.Fatal, bool enabledFlag=true)
Activates the log for this logger for a range of LogMessageType.
Definition: Logger.cs:63
Base implementation for ILogger.
Definition: Logger.cs:10
Arguments of the Logger.MessageLogged event.
bool Activated(LogMessageType type)
Returns a boolean indicating if a particular LogMessageType is activated.
Definition: Logger.cs:95
LogMessageType
Type of a LogMessage.
void Log(ILogMessage logMessage)
Logs the specified log message.
Definition: Logger.cs:100
void ActivateLog(LogMessageType type, bool enabledFlag)
Activates the log for this logger for a specific LogMessageType.
Definition: Logger.cs:85
The base interface for log messages used by the logging infrastructure.
Definition: ILogMessage.cs:8
LogMessageType Type
Gets or sets the type of this message.
Definition: ILogMessage.cs:23
Logger()
Initializes a new instance of the Logger class.
Definition: Logger.cs:22
Interface for logging.
Definition: ILogger.cs:8