NlogManager.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. using MediaBrowser.Model.Logging;
  2. using NLog;
  3. using NLog.Config;
  4. using NLog.Targets;
  5. using NLog.Targets.Wrappers;
  6. using System;
  7. using System.IO;
  8. using System.Linq;
  9. namespace MediaBrowser.Common.Implementations.Logging
  10. {
  11. /// <summary>
  12. /// Class NlogManager
  13. /// </summary>
  14. public class NlogManager : ILogManager
  15. {
  16. /// <summary>
  17. /// Occurs when [logger loaded].
  18. /// </summary>
  19. public event EventHandler LoggerLoaded;
  20. /// <summary>
  21. /// Gets or sets the log directory.
  22. /// </summary>
  23. /// <value>The log directory.</value>
  24. private string LogDirectory { get; set; }
  25. /// <summary>
  26. /// Gets or sets the log file prefix.
  27. /// </summary>
  28. /// <value>The log file prefix.</value>
  29. private string LogFilePrefix { get; set; }
  30. /// <summary>
  31. /// Gets the log file path.
  32. /// </summary>
  33. /// <value>The log file path.</value>
  34. public string LogFilePath { get; private set; }
  35. /// <summary>
  36. /// Gets or sets the exception message prefix.
  37. /// </summary>
  38. /// <value>The exception message prefix.</value>
  39. public string ExceptionMessagePrefix { get; set; }
  40. /// <summary>
  41. /// Initializes a new instance of the <see cref="NlogManager" /> class.
  42. /// </summary>
  43. /// <param name="logDirectory">The log directory.</param>
  44. /// <param name="logFileNamePrefix">The log file name prefix.</param>
  45. public NlogManager(string logDirectory, string logFileNamePrefix)
  46. {
  47. LogDirectory = logDirectory;
  48. LogFilePrefix = logFileNamePrefix;
  49. LogManager.Configuration = new LoggingConfiguration ();
  50. }
  51. private LogSeverity _severity = LogSeverity.Debug;
  52. public LogSeverity LogSeverity
  53. {
  54. get
  55. {
  56. return _severity;
  57. }
  58. set
  59. {
  60. var changed = _severity != value;
  61. _severity = value;
  62. if (changed)
  63. {
  64. UpdateLogLevel(value);
  65. }
  66. }
  67. }
  68. private void UpdateLogLevel(LogSeverity newLevel)
  69. {
  70. var level = GetLogLevel(newLevel);
  71. var rules = LogManager.Configuration.LoggingRules;
  72. foreach (var rule in rules)
  73. {
  74. if (!rule.IsLoggingEnabledForLevel(level))
  75. {
  76. rule.EnableLoggingForLevel(level);
  77. }
  78. }
  79. }
  80. /// <summary>
  81. /// Adds the file target.
  82. /// </summary>
  83. /// <param name="path">The path.</param>
  84. /// <param name="level">The level.</param>
  85. private void AddFileTarget(string path, LogSeverity level)
  86. {
  87. RemoveTarget("ApplicationLogFileWrapper");
  88. var wrapper = new AsyncTargetWrapper ();
  89. wrapper.Name = "ApplicationLogFileWrapper";
  90. var logFile = new FileTarget
  91. {
  92. FileName = path,
  93. Layout = "${longdate} ${level} - ${logger}: ${message}"
  94. };
  95. logFile.Name = "ApplicationLogFile";
  96. wrapper.WrappedTarget = logFile;
  97. AddLogTarget(wrapper, level);
  98. }
  99. /// <summary>
  100. /// Adds the log target.
  101. /// </summary>
  102. /// <param name="target">The target.</param>
  103. /// <param name="level">The level.</param>
  104. public void AddLogTarget(Target target, LogSeverity level)
  105. {
  106. var config = LogManager.Configuration;
  107. config.AddTarget(target.Name, target);
  108. var rule = new LoggingRule("*", GetLogLevel(level), target);
  109. config.LoggingRules.Add(rule);
  110. LogManager.Configuration = config;
  111. }
  112. /// <summary>
  113. /// Removes the target.
  114. /// </summary>
  115. /// <param name="name">The name.</param>
  116. public void RemoveTarget(string name)
  117. {
  118. var config = LogManager.Configuration;
  119. var target = config.FindTargetByName(name);
  120. if (target != null)
  121. {
  122. foreach (var rule in config.LoggingRules.ToList())
  123. {
  124. var contains = rule.Targets.Contains(target);
  125. rule.Targets.Remove(target);
  126. if (contains)
  127. {
  128. config.LoggingRules.Remove(rule);
  129. }
  130. }
  131. config.RemoveTarget(name);
  132. LogManager.Configuration = config;
  133. }
  134. }
  135. /// <summary>
  136. /// Gets the logger.
  137. /// </summary>
  138. /// <param name="name">The name.</param>
  139. /// <returns>ILogger.</returns>
  140. public ILogger GetLogger(string name)
  141. {
  142. return new NLogger(name, this);
  143. }
  144. /// <summary>
  145. /// Gets the log level.
  146. /// </summary>
  147. /// <param name="severity">The severity.</param>
  148. /// <returns>LogLevel.</returns>
  149. /// <exception cref="System.ArgumentException">Unrecognized LogSeverity</exception>
  150. private LogLevel GetLogLevel(LogSeverity severity)
  151. {
  152. switch (severity)
  153. {
  154. case LogSeverity.Debug:
  155. return LogLevel.Debug;
  156. case LogSeverity.Error:
  157. return LogLevel.Error;
  158. case LogSeverity.Fatal:
  159. return LogLevel.Fatal;
  160. case LogSeverity.Info:
  161. return LogLevel.Info;
  162. case LogSeverity.Warn:
  163. return LogLevel.Warn;
  164. default:
  165. throw new ArgumentException("Unrecognized LogSeverity");
  166. }
  167. }
  168. /// <summary>
  169. /// Reloads the logger.
  170. /// </summary>
  171. /// <param name="level">The level.</param>
  172. public void ReloadLogger(LogSeverity level)
  173. {
  174. LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(DateTime.Now.Ticks / 10000000) + ".txt");
  175. Directory.CreateDirectory(Path.GetDirectoryName(LogFilePath));
  176. AddFileTarget(LogFilePath, level);
  177. LogSeverity = level;
  178. if (LoggerLoaded != null)
  179. {
  180. try
  181. {
  182. LoggerLoaded(this, EventArgs.Empty);
  183. }
  184. catch (Exception ex)
  185. {
  186. GetLogger("Logger").ErrorException("Error in LoggerLoaded event", ex);
  187. }
  188. }
  189. }
  190. /// <summary>
  191. /// Flushes this instance.
  192. /// </summary>
  193. public void Flush()
  194. {
  195. LogManager.Flush();
  196. }
  197. public void AddConsoleOutput()
  198. {
  199. RemoveTarget("ConsoleTargetWrapper");
  200. var wrapper = new AsyncTargetWrapper ();
  201. wrapper.Name = "ConsoleTargetWrapper";
  202. var target = new ConsoleTarget()
  203. {
  204. Layout = "${level}, ${logger}, ${message}",
  205. Error = false
  206. };
  207. target.Name = "ConsoleTarget";
  208. wrapper.WrappedTarget = target;
  209. AddLogTarget(wrapper, LogSeverity);
  210. }
  211. public void RemoveConsoleOutput()
  212. {
  213. RemoveTarget("ConsoleTargetWrapper");
  214. }
  215. }
  216. }