NlogManager.cs 5.3 KB

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