NlogManager.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using System.Linq;
  2. using MediaBrowser.Model.Logging;
  3. using NLog;
  4. using NLog.Config;
  5. using NLog.Targets;
  6. using System;
  7. using System.IO;
  8. using System.Threading.Tasks;
  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. }
  45. /// <summary>
  46. /// Adds the file target.
  47. /// </summary>
  48. /// <param name="path">The path.</param>
  49. /// <param name="level">The level.</param>
  50. private void AddFileTarget(string path, LogSeverity level)
  51. {
  52. var logFile = new FileTarget();
  53. logFile.FileName = path;
  54. logFile.Layout = "${longdate}, ${level}, ${logger}, ${message}";
  55. RemoveTarget("ApplicationLogFile");
  56. logFile.Name = "ApplicationLogFile";
  57. AddLogTarget(logFile, level);
  58. }
  59. /// <summary>
  60. /// Adds the log target.
  61. /// </summary>
  62. /// <param name="target">The target.</param>
  63. /// <param name="level">The level.</param>
  64. private void AddLogTarget(Target target, LogSeverity level)
  65. {
  66. var config = LogManager.Configuration;
  67. config.AddTarget(target.Name, target);
  68. var rule = new LoggingRule("*", GetLogLevel(level), target);
  69. config.LoggingRules.Add(rule);
  70. LogManager.Configuration = config;
  71. }
  72. /// <summary>
  73. /// Removes the target.
  74. /// </summary>
  75. /// <param name="name">The name.</param>
  76. public void RemoveTarget(string name)
  77. {
  78. var config = LogManager.Configuration;
  79. var target = config.FindTargetByName(name);
  80. if (target != null)
  81. {
  82. foreach (var rule in config.LoggingRules.ToList())
  83. {
  84. var contains = rule.Targets.Contains(target);
  85. rule.Targets.Remove(target);
  86. if (contains)
  87. {
  88. config.LoggingRules.Remove(rule);
  89. }
  90. }
  91. config.RemoveTarget(name);
  92. LogManager.Configuration = config;
  93. }
  94. }
  95. /// <summary>
  96. /// Gets the logger.
  97. /// </summary>
  98. /// <param name="name">The name.</param>
  99. /// <returns>ILogger.</returns>
  100. public ILogger GetLogger(string name)
  101. {
  102. return new NLogger(name);
  103. }
  104. /// <summary>
  105. /// Gets the log level.
  106. /// </summary>
  107. /// <param name="severity">The severity.</param>
  108. /// <returns>LogLevel.</returns>
  109. /// <exception cref="System.ArgumentException">Unrecognized LogSeverity</exception>
  110. private LogLevel GetLogLevel(LogSeverity severity)
  111. {
  112. switch (severity)
  113. {
  114. case LogSeverity.Debug:
  115. return LogLevel.Debug;
  116. case LogSeverity.Error:
  117. return LogLevel.Error;
  118. case LogSeverity.Fatal:
  119. return LogLevel.Fatal;
  120. case LogSeverity.Info:
  121. return LogLevel.Info;
  122. case LogSeverity.Warn:
  123. return LogLevel.Warn;
  124. default:
  125. throw new ArgumentException("Unrecognized LogSeverity");
  126. }
  127. }
  128. /// <summary>
  129. /// Reloads the logger.
  130. /// </summary>
  131. /// <param name="level">The level.</param>
  132. public void ReloadLogger(LogSeverity level)
  133. {
  134. LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + DateTime.Now.Ticks + ".log");
  135. AddFileTarget(LogFilePath, level);
  136. if (LoggerLoaded != null)
  137. {
  138. Task.Run(() =>
  139. {
  140. try
  141. {
  142. LoggerLoaded(this, EventArgs.Empty);
  143. }
  144. catch (Exception ex)
  145. {
  146. GetLogger("Logger").ErrorException("Error in LoggerLoaded event", ex);
  147. }
  148. });
  149. }
  150. }
  151. }
  152. }