2
0

NlogManager.cs 7.0 KB

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