2
0

NlogManager.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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. foreach (var lev in rule.Levels.ToArray())
  79. {
  80. if (lev < level)
  81. {
  82. rule.DisableLoggingForLevel(lev);
  83. }
  84. }
  85. }
  86. }
  87. /// <summary>
  88. /// Adds the file target.
  89. /// </summary>
  90. /// <param name="path">The path.</param>
  91. /// <param name="level">The level.</param>
  92. private void AddFileTarget(string path, LogSeverity level)
  93. {
  94. RemoveTarget("ApplicationLogFileWrapper");
  95. var wrapper = new AsyncTargetWrapper ();
  96. wrapper.Name = "ApplicationLogFileWrapper";
  97. var logFile = new FileTarget
  98. {
  99. FileName = path,
  100. Layout = "${longdate} ${level} - ${logger}: ${message}"
  101. };
  102. logFile.Name = "ApplicationLogFile";
  103. wrapper.WrappedTarget = logFile;
  104. AddLogTarget(wrapper, level);
  105. }
  106. /// <summary>
  107. /// Adds the log target.
  108. /// </summary>
  109. /// <param name="target">The target.</param>
  110. /// <param name="level">The level.</param>
  111. public void AddLogTarget(Target target, LogSeverity level)
  112. {
  113. var config = LogManager.Configuration;
  114. config.AddTarget(target.Name, target);
  115. var rule = new LoggingRule("*", GetLogLevel(level), target);
  116. config.LoggingRules.Add(rule);
  117. LogManager.Configuration = config;
  118. }
  119. /// <summary>
  120. /// Removes the target.
  121. /// </summary>
  122. /// <param name="name">The name.</param>
  123. public void RemoveTarget(string name)
  124. {
  125. var config = LogManager.Configuration;
  126. var target = config.FindTargetByName(name);
  127. if (target != null)
  128. {
  129. foreach (var rule in config.LoggingRules.ToList())
  130. {
  131. var contains = rule.Targets.Contains(target);
  132. rule.Targets.Remove(target);
  133. if (contains)
  134. {
  135. config.LoggingRules.Remove(rule);
  136. }
  137. }
  138. config.RemoveTarget(name);
  139. LogManager.Configuration = config;
  140. }
  141. }
  142. /// <summary>
  143. /// Gets the logger.
  144. /// </summary>
  145. /// <param name="name">The name.</param>
  146. /// <returns>ILogger.</returns>
  147. public Model.Logging.ILogger GetLogger(string name)
  148. {
  149. return new NLogger(name, this);
  150. }
  151. /// <summary>
  152. /// Gets the log level.
  153. /// </summary>
  154. /// <param name="severity">The severity.</param>
  155. /// <returns>LogLevel.</returns>
  156. /// <exception cref="System.ArgumentException">Unrecognized LogSeverity</exception>
  157. private LogLevel GetLogLevel(LogSeverity severity)
  158. {
  159. switch (severity)
  160. {
  161. case LogSeverity.Debug:
  162. return LogLevel.Debug;
  163. case LogSeverity.Error:
  164. return LogLevel.Error;
  165. case LogSeverity.Fatal:
  166. return LogLevel.Fatal;
  167. case LogSeverity.Info:
  168. return LogLevel.Info;
  169. case LogSeverity.Warn:
  170. return LogLevel.Warn;
  171. default:
  172. throw new ArgumentException("Unrecognized LogSeverity");
  173. }
  174. }
  175. /// <summary>
  176. /// Reloads the logger.
  177. /// </summary>
  178. /// <param name="level">The level.</param>
  179. public void ReloadLogger(LogSeverity level)
  180. {
  181. LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(DateTime.Now.Ticks / 10000000) + ".txt");
  182. _fileSystem.CreateDirectory(Path.GetDirectoryName(LogFilePath));
  183. AddFileTarget(LogFilePath, level);
  184. LogSeverity = level;
  185. if (LoggerLoaded != null)
  186. {
  187. try
  188. {
  189. LoggerLoaded(this, EventArgs.Empty);
  190. }
  191. catch (Exception ex)
  192. {
  193. GetLogger("Logger").ErrorException("Error in LoggerLoaded event", ex);
  194. }
  195. }
  196. }
  197. /// <summary>
  198. /// Flushes this instance.
  199. /// </summary>
  200. public void Flush()
  201. {
  202. LogManager.Flush();
  203. }
  204. public void AddConsoleOutput()
  205. {
  206. RemoveTarget("ConsoleTargetWrapper");
  207. var wrapper = new AsyncTargetWrapper ();
  208. wrapper.Name = "ConsoleTargetWrapper";
  209. var target = new ConsoleTarget()
  210. {
  211. Layout = "${level}, ${logger}, ${message}",
  212. Error = false
  213. };
  214. target.Name = "ConsoleTarget";
  215. wrapper.WrappedTarget = target;
  216. AddLogTarget(wrapper, LogSeverity);
  217. }
  218. public void RemoveConsoleOutput()
  219. {
  220. RemoveTarget("ConsoleTargetWrapper");
  221. }
  222. }
  223. }