From 1f5addfbb7bde693ec2c785e233d99635604f638 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 29 Oct 2016 16:13:23 -0400 Subject: move dependencies --- Emby.Common.Implementations/Logging/NLogger.cs | 224 +++++++++++++++++ Emby.Common.Implementations/Logging/NlogManager.cs | 264 +++++++++++++++++++++ 2 files changed, 488 insertions(+) create mode 100644 Emby.Common.Implementations/Logging/NLogger.cs create mode 100644 Emby.Common.Implementations/Logging/NlogManager.cs (limited to 'Emby.Common.Implementations/Logging') diff --git a/Emby.Common.Implementations/Logging/NLogger.cs b/Emby.Common.Implementations/Logging/NLogger.cs new file mode 100644 index 0000000000..8abd3d0d92 --- /dev/null +++ b/Emby.Common.Implementations/Logging/NLogger.cs @@ -0,0 +1,224 @@ +using MediaBrowser.Model.Logging; +using System; +using System.Text; + +namespace Emby.Common.Implementations.Logging +{ + /// + /// Class NLogger + /// + public class NLogger : ILogger + { + /// + /// The _logger + /// + private readonly NLog.Logger _logger; + + private readonly ILogManager _logManager; + + /// + /// The _lock object + /// + private static readonly object LockObject = new object(); + + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// The log manager. + public NLogger(string name, ILogManager logManager) + { + _logManager = logManager; + lock (LockObject) + { + _logger = NLog.LogManager.GetLogger(name); + } + } + + /// + /// Infoes the specified message. + /// + /// The message. + /// The param list. + public void Info(string message, params object[] paramList) + { + _logger.Info(message, paramList); + } + + /// + /// Errors the specified message. + /// + /// The message. + /// The param list. + public void Error(string message, params object[] paramList) + { + _logger.Error(message, paramList); + } + + /// + /// Warns the specified message. + /// + /// The message. + /// The param list. + public void Warn(string message, params object[] paramList) + { + _logger.Warn(message, paramList); + } + + /// + /// Debugs the specified message. + /// + /// The message. + /// The param list. + public void Debug(string message, params object[] paramList) + { + if (_logManager.LogSeverity == LogSeverity.Info) + { + return; + } + + _logger.Debug(message, paramList); + } + + /// + /// Logs the exception. + /// + /// The message. + /// The exception. + /// The param list. + /// + public void ErrorException(string message, Exception exception, params object[] paramList) + { + LogException(LogSeverity.Error, message, exception, paramList); + } + + /// + /// Logs the exception. + /// + /// The level. + /// The message. + /// The exception. + /// The param list. + private void LogException(LogSeverity level, string message, Exception exception, params object[] paramList) + { + message = FormatMessage(message, paramList).Replace(Environment.NewLine, ". "); + + var messageText = LogHelper.GetLogMessage(exception); + + var prefix = _logManager.ExceptionMessagePrefix; + + if (!string.IsNullOrWhiteSpace(prefix)) + { + messageText.Insert(0, prefix); + } + + LogMultiline(message, level, messageText); + } + + /// + /// Formats the message. + /// + /// The message. + /// The param list. + /// System.String. + private static string FormatMessage(string message, params object[] paramList) + { + if (paramList != null) + { + for (var i = 0; i < paramList.Length; i++) + { + var obj = paramList[i]; + + message = message.Replace("{" + i + "}", (obj == null ? "null" : obj.ToString())); + } + } + + return message; + } + + /// + /// Logs the multiline. + /// + /// The message. + /// The severity. + /// Content of the additional. + public void LogMultiline(string message, LogSeverity severity, StringBuilder additionalContent) + { + if (severity == LogSeverity.Debug && _logManager.LogSeverity == LogSeverity.Info) + { + return; + } + + additionalContent.Insert(0, message + Environment.NewLine); + + const char tabChar = '\t'; + + var text = additionalContent.ToString() + .Replace(Environment.NewLine, Environment.NewLine + tabChar) + .TrimEnd(tabChar); + + if (text.EndsWith(Environment.NewLine)) + { + text = text.Substring(0, text.LastIndexOf(Environment.NewLine, StringComparison.OrdinalIgnoreCase)); + } + + _logger.Log(GetLogLevel(severity), text); + } + + /// + /// Gets the log level. + /// + /// The severity. + /// NLog.LogLevel. + private NLog.LogLevel GetLogLevel(LogSeverity severity) + { + switch (severity) + { + case LogSeverity.Debug: + return NLog.LogLevel.Debug; + case LogSeverity.Error: + return NLog.LogLevel.Error; + case LogSeverity.Warn: + return NLog.LogLevel.Warn; + case LogSeverity.Fatal: + return NLog.LogLevel.Fatal; + case LogSeverity.Info: + return NLog.LogLevel.Info; + default: + throw new ArgumentException("Unknown LogSeverity: " + severity.ToString()); + } + } + + /// + /// Logs the specified severity. + /// + /// The severity. + /// The message. + /// The param list. + public void Log(LogSeverity severity, string message, params object[] paramList) + { + _logger.Log(GetLogLevel(severity), message, paramList); + } + + /// + /// Fatals the specified message. + /// + /// The message. + /// The param list. + public void Fatal(string message, params object[] paramList) + { + _logger.Fatal(message, paramList); + } + + /// + /// Fatals the exception. + /// + /// The message. + /// The exception. + /// The param list. + public void FatalException(string message, Exception exception, params object[] paramList) + { + LogException(LogSeverity.Fatal, message, exception, paramList); + } + } +} diff --git a/Emby.Common.Implementations/Logging/NlogManager.cs b/Emby.Common.Implementations/Logging/NlogManager.cs new file mode 100644 index 0000000000..e38b87bd13 --- /dev/null +++ b/Emby.Common.Implementations/Logging/NlogManager.cs @@ -0,0 +1,264 @@ +using System; +using System.IO; +using System.Linq; +using NLog; +using NLog.Config; +using NLog.Targets; +using NLog.Targets.Wrappers; +using MediaBrowser.Model.Logging; + +namespace Emby.Common.Implementations.Logging +{ + /// + /// Class NlogManager + /// + public class NlogManager : ILogManager + { + /// + /// Occurs when [logger loaded]. + /// + public event EventHandler LoggerLoaded; + /// + /// Gets or sets the log directory. + /// + /// The log directory. + private string LogDirectory { get; set; } + /// + /// Gets or sets the log file prefix. + /// + /// The log file prefix. + private string LogFilePrefix { get; set; } + /// + /// Gets the log file path. + /// + /// The log file path. + public string LogFilePath { get; private set; } + + /// + /// Gets or sets the exception message prefix. + /// + /// The exception message prefix. + public string ExceptionMessagePrefix { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// The log directory. + /// The log file name prefix. + public NlogManager(string logDirectory, string logFileNamePrefix) + { + LogDirectory = logDirectory; + LogFilePrefix = logFileNamePrefix; + + LogManager.Configuration = new LoggingConfiguration (); + } + + private LogSeverity _severity = LogSeverity.Debug; + public LogSeverity LogSeverity + { + get + { + return _severity; + } + set + { + var changed = _severity != value; + + _severity = value; + + if (changed) + { + UpdateLogLevel(value); + } + } + } + + private void UpdateLogLevel(LogSeverity newLevel) + { + var level = GetLogLevel(newLevel); + + var rules = LogManager.Configuration.LoggingRules; + + foreach (var rule in rules) + { + if (!rule.IsLoggingEnabledForLevel(level)) + { + rule.EnableLoggingForLevel(level); + } + foreach (var lev in rule.Levels.ToArray()) + { + if (lev < level) + { + rule.DisableLoggingForLevel(lev); + } + } + } + } + + /// + /// Adds the file target. + /// + /// The path. + /// The level. + private void AddFileTarget(string path, LogSeverity level) + { + RemoveTarget("ApplicationLogFileWrapper"); + + var wrapper = new AsyncTargetWrapper (); + wrapper.Name = "ApplicationLogFileWrapper"; + + var logFile = new FileTarget + { + FileName = path, + Layout = "${longdate} ${level} ${logger}: ${message}" + }; + + logFile.Name = "ApplicationLogFile"; + + wrapper.WrappedTarget = logFile; + + AddLogTarget(wrapper, level); + } + + /// + /// Adds the log target. + /// + /// The target. + /// The level. + public void AddLogTarget(Target target, LogSeverity level) + { + var config = LogManager.Configuration; + config.AddTarget(target.Name, target); + + var rule = new LoggingRule("*", GetLogLevel(level), target); + config.LoggingRules.Add(rule); + + LogManager.Configuration = config; + } + + /// + /// Removes the target. + /// + /// The name. + public void RemoveTarget(string name) + { + var config = LogManager.Configuration; + + var target = config.FindTargetByName(name); + + if (target != null) + { + foreach (var rule in config.LoggingRules.ToList()) + { + var contains = rule.Targets.Contains(target); + + rule.Targets.Remove(target); + + if (contains) + { + config.LoggingRules.Remove(rule); + } + } + + config.RemoveTarget(name); + LogManager.Configuration = config; + } + } + + /// + /// Gets the logger. + /// + /// The name. + /// ILogger. + public MediaBrowser.Model.Logging.ILogger GetLogger(string name) + { + return new NLogger(name, this); + } + + /// + /// Gets the log level. + /// + /// The severity. + /// LogLevel. + /// Unrecognized LogSeverity + private LogLevel GetLogLevel(LogSeverity severity) + { + switch (severity) + { + case LogSeverity.Debug: + return LogLevel.Debug; + case LogSeverity.Error: + return LogLevel.Error; + case LogSeverity.Fatal: + return LogLevel.Fatal; + case LogSeverity.Info: + return LogLevel.Info; + case LogSeverity.Warn: + return LogLevel.Warn; + default: + throw new ArgumentException("Unrecognized LogSeverity"); + } + } + + /// + /// Reloads the logger. + /// + /// The level. + public void ReloadLogger(LogSeverity level) + { + LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Floor(DateTime.Now.Ticks / 10000000) + ".txt"); + + Directory.CreateDirectory(Path.GetDirectoryName(LogFilePath)); + + AddFileTarget(LogFilePath, level); + + LogSeverity = level; + + if (LoggerLoaded != null) + { + try + { + LoggerLoaded(this, EventArgs.Empty); + } + catch (Exception ex) + { + GetLogger("Logger").ErrorException("Error in LoggerLoaded event", ex); + } + } + } + + /// + /// Flushes this instance. + /// + public void Flush() + { + LogManager.Flush(); + } + + + public void AddConsoleOutput() + { + RemoveTarget("ConsoleTargetWrapper"); + + var wrapper = new AsyncTargetWrapper (); + wrapper.Name = "ConsoleTargetWrapper"; + + var target = new ConsoleTarget() + { + Layout = "${level}, ${logger}, ${message}", + Error = false + }; + + target.Name = "ConsoleTarget"; + + wrapper.WrappedTarget = target; + + AddLogTarget(wrapper, LogSeverity); + } + + public void RemoveConsoleOutput() + { + RemoveTarget("ConsoleTargetWrapper"); + } + } +} -- cgit v1.2.3 From 2481c5d9f89be22d9e15c89a05763f167f51797f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 17 Dec 2016 15:52:05 -0500 Subject: fix boxset socket events --- .../IO/ManagedFileSystem.cs | 5 +- Emby.Common.Implementations/Logging/NlogManager.cs | 450 +++++++++++++++++---- .../EntryPoints/ExternalPortForwarding.cs | 2 +- .../Updates/InstallationManager.cs | 9 +- MediaBrowser.Controller/Entities/Folder.cs | 10 + 5 files changed, 383 insertions(+), 93 deletions(-) (limited to 'Emby.Common.Implementations/Logging') diff --git a/Emby.Common.Implementations/IO/ManagedFileSystem.cs b/Emby.Common.Implementations/IO/ManagedFileSystem.cs index b5943e17b0..62d285072c 100644 --- a/Emby.Common.Implementations/IO/ManagedFileSystem.cs +++ b/Emby.Common.Implementations/IO/ManagedFileSystem.cs @@ -488,20 +488,17 @@ namespace Emby.Common.Implementations.IO } var temp1 = Path.GetTempFileName(); - var temp2 = Path.GetTempFileName(); // Copying over will fail against hidden files RemoveHiddenAttribute(file1); RemoveHiddenAttribute(file2); CopyFile(file1, temp1, true); - CopyFile(file2, temp2, true); + CopyFile(file2, file1, true); CopyFile(temp1, file2, true); - CopyFile(temp2, file1, true); DeleteFile(temp1); - DeleteFile(temp2); } /// diff --git a/Emby.Common.Implementations/Logging/NlogManager.cs b/Emby.Common.Implementations/Logging/NlogManager.cs index e38b87bd13..f7b723e8bc 100644 --- a/Emby.Common.Implementations/Logging/NlogManager.cs +++ b/Emby.Common.Implementations/Logging/NlogManager.cs @@ -1,8 +1,10 @@ using System; using System.IO; using System.Linq; +using System.Xml; using NLog; using NLog.Config; +using NLog.Filters; using NLog.Targets; using NLog.Targets.Wrappers; using MediaBrowser.Model.Logging; @@ -14,20 +16,35 @@ namespace Emby.Common.Implementations.Logging /// public class NlogManager : ILogManager { - /// - /// Occurs when [logger loaded]. - /// - public event EventHandler LoggerLoaded; + #region Private Fields + + private LogSeverity _severity = LogSeverity.Debug; + /// /// Gets or sets the log directory. /// /// The log directory. - private string LogDirectory { get; set; } + private readonly string LogDirectory; + /// /// Gets or sets the log file prefix. /// /// The log file prefix. - private string LogFilePrefix { get; set; } + private readonly string LogFilePrefix; + + #endregion + + #region Event Declarations + + /// + /// Occurs when [logger loaded]. + /// + public event EventHandler LoggerLoaded; + + #endregion + + #region Public Properties + /// /// Gets the log file path. /// @@ -40,28 +57,25 @@ namespace Emby.Common.Implementations.Logging /// The exception message prefix. public string ExceptionMessagePrefix { get; set; } - /// - /// Initializes a new instance of the class. - /// - /// The log directory. - /// The log file name prefix. - public NlogManager(string logDirectory, string logFileNamePrefix) - { - LogDirectory = logDirectory; - LogFilePrefix = logFileNamePrefix; + public string NLogConfigurationFilePath { get; set; } - LogManager.Configuration = new LoggingConfiguration (); - } - - private LogSeverity _severity = LogSeverity.Debug; public LogSeverity LogSeverity { + get { return _severity; } + set { + DebugFileWriter( + LogDirectory, String.Format( + "SET LogSeverity, _severity = [{0}], value = [{1}]", + _severity.ToString(), + value.ToString() + )); + var changed = _severity != value; _severity = value; @@ -70,11 +84,124 @@ namespace Emby.Common.Implementations.Logging { UpdateLogLevel(value); } + + } + } + + #endregion + + #region Constructor(s) + + /// + /// Initializes a new instance of the class. + /// + /// The log directory. + /// The log file name prefix. + public NlogManager(string logDirectory, string logFileNamePrefix) + { + DebugFileWriter( + logDirectory, String.Format( + "NlogManager constructor called, logDirectory is [{0}], logFileNamePrefix is [{1}], _severity is [{2}].", + logDirectory, + logFileNamePrefix, + _severity.ToString() + )); + + LogDirectory = logDirectory; + LogFilePrefix = logFileNamePrefix; + + LogManager.Configuration = new LoggingConfiguration(); + } + + /// + /// Initializes a new instance of the class. + /// + /// The log directory. + /// The log file name prefix. + public NlogManager(string logDirectory, string logFileNamePrefix, LogSeverity initialSeverity) : this(logDirectory, logFileNamePrefix) + { + _severity = initialSeverity; + + DebugFileWriter( + logDirectory, String.Format( + "NlogManager constructor called, logDirectory is [{0}], logFileNamePrefix is [{1}], _severity is [{2}].", + logDirectory, + logFileNamePrefix, + _severity.ToString() + )); + } + + #endregion + + #region Private Methods + + /// + /// Adds the file target. + /// + /// The path. + /// The level. + private void AddFileTarget(string path, LogSeverity level) + { + + DebugFileWriter( + LogDirectory, String.Format( + "AddFileTarget called, path = [{0}], level = [{1}].", + path, + level.ToString() + )); + + RemoveTarget("ApplicationLogFileWrapper"); + + var wrapper = new AsyncTargetWrapper(); + wrapper.Name = "ApplicationLogFileWrapper"; + + var logFile = new FileTarget + { + FileName = path, + Layout = "${longdate} ${level} ${logger}: ${message}" + }; + + logFile.Name = "ApplicationLogFile"; + + wrapper.WrappedTarget = logFile; + + AddLogTarget(wrapper, level); + + } + + /// + /// Gets the log level. + /// + /// The severity. + /// LogLevel. + /// Unrecognized LogSeverity + private LogLevel GetLogLevel(LogSeverity severity) + { + switch (severity) + { + case LogSeverity.Debug: + return LogLevel.Debug; + case LogSeverity.Error: + return LogLevel.Error; + case LogSeverity.Fatal: + return LogLevel.Fatal; + case LogSeverity.Info: + return LogLevel.Info; + case LogSeverity.Warn: + return LogLevel.Warn; + default: + throw new ArgumentException("Unrecognized LogSeverity"); } } private void UpdateLogLevel(LogSeverity newLevel) { + DebugFileWriter( + LogDirectory, String.Format( + "UpdateLogLevel called, newLevel = [{0}].", + newLevel.ToString() + )); + var level = GetLogLevel(newLevel); var rules = LogManager.Configuration.LoggingRules; @@ -95,29 +222,117 @@ namespace Emby.Common.Implementations.Logging } } - /// - /// Adds the file target. - /// - /// The path. - /// The level. - private void AddFileTarget(string path, LogSeverity level) + private void AddCustomFilters(string defaultLoggerNamePattern, LoggingRule defaultRule) { - RemoveTarget("ApplicationLogFileWrapper"); + DebugFileWriter( + LogDirectory, String.Format( + "AddCustomFilters called, defaultLoggerNamePattern = [{0}], defaultRule.LoggerNamePattern = [{1}].", + defaultLoggerNamePattern, + defaultRule.LoggerNamePattern + )); + + try + { + var customConfig = new NLog.Config.XmlLoggingConfiguration(NLogConfigurationFilePath); - var wrapper = new AsyncTargetWrapper (); - wrapper.Name = "ApplicationLogFileWrapper"; + DebugFileWriter( + LogDirectory, String.Format( + "Custom Configuration Loaded, Rule Count = [{0}].", + customConfig.LoggingRules.Count.ToString() + )); - var logFile = new FileTarget + foreach (var customRule in customConfig.LoggingRules) + { + + DebugFileWriter( + LogDirectory, String.Format( + "Read Custom Rule, LoggerNamePattern = [{0}], Targets = [{1}].", + customRule.LoggerNamePattern, + string.Join(",", customRule.Targets.Select(x => x.Name).ToList()) + )); + + if (customRule.LoggerNamePattern.Equals(defaultLoggerNamePattern)) + { + + if (customRule.Targets.Any((arg) => arg.Name.Equals(defaultRule.Targets.First().Name))) + { + + DebugFileWriter( + LogDirectory, String.Format( + "Custom rule filters can be applied to this target, Filter Count = [{0}].", + customRule.Filters.Count.ToString() + )); + + foreach (ConditionBasedFilter customFilter in customRule.Filters) + { + + DebugFileWriter( + LogDirectory, String.Format( + "Read Custom Filter, Filter = [{0}], Action = [{1}], Type = [{2}].", + customFilter.Condition.ToString(), + customFilter.Action.ToString(), + customFilter.GetType().ToString() + )); + + defaultRule.Filters.Add(customFilter); + + } + } + else + { + + DebugFileWriter( + LogDirectory, String.Format( + "Ignoring custom rule as [Target] does not match." + )); + + } + + } + else + { + + DebugFileWriter( + LogDirectory, String.Format( + "Ignoring custom rule as [LoggerNamePattern] does not match." + )); + + } + } + } + catch (Exception ex) { - FileName = path, - Layout = "${longdate} ${level} ${logger}: ${message}" - }; + // Intentionally do nothing, prevent issues affecting normal execution. + DebugFileWriter( + LogDirectory, String.Format( + "Exception in AddCustomFilters, ex.Message = [{0}].", + ex.Message + ) + ); - logFile.Name = "ApplicationLogFile"; + } + } - wrapper.WrappedTarget = logFile; + #endregion + + #region Public Methods + + /// + /// Gets the logger. + /// + /// The name. + /// ILogger. + public MediaBrowser.Model.Logging.ILogger GetLogger(string name) + { + + DebugFileWriter( + LogDirectory, String.Format( + "GetLogger called, name = [{0}].", + name + )); + + return new NLogger(name, this); - AddLogTarget(wrapper, level); } /// @@ -127,13 +342,26 @@ namespace Emby.Common.Implementations.Logging /// The level. public void AddLogTarget(Target target, LogSeverity level) { + + DebugFileWriter( + LogDirectory, String.Format( + "AddLogTarget called, target.Name = [{0}], level = [{1}].", + target.Name, + level.ToString() + )); + + string loggerNamePattern = "*"; var config = LogManager.Configuration; + var rule = new LoggingRule(loggerNamePattern, GetLogLevel(level), target); + config.AddTarget(target.Name, target); - var rule = new LoggingRule("*", GetLogLevel(level), target); + AddCustomFilters(loggerNamePattern, rule); + config.LoggingRules.Add(rule); LogManager.Configuration = config; + } /// @@ -142,6 +370,13 @@ namespace Emby.Common.Implementations.Logging /// The name. public void RemoveTarget(string name) { + + DebugFileWriter( + LogDirectory, String.Format( + "RemoveTarget called, name = [{0}].", + name + )); + var config = LogManager.Configuration; var target = config.FindTargetByName(name); @@ -165,50 +400,70 @@ namespace Emby.Common.Implementations.Logging } } - /// - /// Gets the logger. - /// - /// The name. - /// ILogger. - public MediaBrowser.Model.Logging.ILogger GetLogger(string name) + public void AddConsoleOutput() { - return new NLogger(name, this); + + DebugFileWriter( + LogDirectory, String.Format( + "AddConsoleOutput called." + )); + + RemoveTarget("ConsoleTargetWrapper"); + + var wrapper = new AsyncTargetWrapper(); + wrapper.Name = "ConsoleTargetWrapper"; + + var target = new ConsoleTarget() + { + Layout = "${level}, ${logger}, ${message}", + Error = false + }; + + target.Name = "ConsoleTarget"; + + wrapper.WrappedTarget = target; + + AddLogTarget(wrapper, LogSeverity); + + } + + public void RemoveConsoleOutput() + { + + DebugFileWriter( + LogDirectory, String.Format( + "RemoveConsoleOutput called." + )); + + RemoveTarget("ConsoleTargetWrapper"); + } /// - /// Gets the log level. + /// Reloads the logger, maintaining the current log level. /// - /// The severity. - /// LogLevel. - /// Unrecognized LogSeverity - private LogLevel GetLogLevel(LogSeverity severity) + public void ReloadLogger() { - switch (severity) - { - case LogSeverity.Debug: - return LogLevel.Debug; - case LogSeverity.Error: - return LogLevel.Error; - case LogSeverity.Fatal: - return LogLevel.Fatal; - case LogSeverity.Info: - return LogLevel.Info; - case LogSeverity.Warn: - return LogLevel.Warn; - default: - throw new ArgumentException("Unrecognized LogSeverity"); - } + ReloadLogger(LogSeverity); } /// - /// Reloads the logger. + /// Reloads the logger, using the specified logging level. /// /// The level. public void ReloadLogger(LogSeverity level) { + + DebugFileWriter( + LogDirectory, String.Format( + "ReloadLogger called, level = [{0}], LogFilePath (existing) = [{1}].", + level.ToString(), + LogFilePath + )); + LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Floor(DateTime.Now.Ticks / 10000000) + ".txt"); - Directory.CreateDirectory(Path.GetDirectoryName(LogFilePath)); + Directory.CreateDirectory(Path.GetDirectoryName(LogFilePath)); AddFileTarget(LogFilePath, level); @@ -218,7 +473,14 @@ namespace Emby.Common.Implementations.Logging { try { + + DebugFileWriter( + LogDirectory, String.Format( + "ReloadLogger called, raised event LoggerLoaded." + )); + LoggerLoaded(this, EventArgs.Empty); + } catch (Exception ex) { @@ -232,33 +494,51 @@ namespace Emby.Common.Implementations.Logging /// public void Flush() { - LogManager.Flush(); - } + DebugFileWriter( + LogDirectory, String.Format( + "Flush called." + )); - public void AddConsoleOutput() - { - RemoveTarget("ConsoleTargetWrapper"); + LogManager.Flush(); - var wrapper = new AsyncTargetWrapper (); - wrapper.Name = "ConsoleTargetWrapper"; + } - var target = new ConsoleTarget() - { - Layout = "${level}, ${logger}, ${message}", - Error = false - }; + #endregion - target.Name = "ConsoleTarget"; + #region Conditional Debug Methods - wrapper.WrappedTarget = target; + /// + /// DEBUG: Standalone method to write out debug to assist with logger development/troubleshooting. + /// + /// The output file will be written to the server's log directory. + /// Calls to the method are safe and will never throw any exceptions. + /// Method calls will be omitted unless the library is compiled with DEBUG defined. + /// + /// + private static void DebugFileWriter(string logDirectory, string message) + { +#if DEBUG + try + { - AddLogTarget(wrapper, LogSeverity); - } + System.IO.File.AppendAllText( + Path.Combine(logDirectory, "NlogManager.txt"), + String.Format( + "{0} : {1}{2}", + System.DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + message, + System.Environment.NewLine + ) + ); - public void RemoveConsoleOutput() - { - RemoveTarget("ConsoleTargetWrapper"); + } + catch (Exception ex) + { + // Intentionally do nothing, prevent issues affecting normal execution. + } +#endif } + #endregion } -} +} \ No newline at end of file diff --git a/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs b/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs index 11e275940d..b75de2ff4f 100644 --- a/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs +++ b/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs @@ -238,7 +238,7 @@ namespace Emby.Server.Core.EntryPoints } catch (Exception ex) { - _logger.ErrorException("Error creating port map", ex); + _logger.Error("Error creating port map: " + ex.Message); } } diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs index 52bf09284b..0420900c55 100644 --- a/Emby.Server.Implementations/Updates/InstallationManager.cs +++ b/Emby.Server.Implementations/Updates/InstallationManager.cs @@ -42,7 +42,8 @@ namespace Emby.Server.Implementations.Updates /// private ConcurrentBag CompletedInstallationsInternal { get; set; } - public IEnumerable CompletedInstallations { + public IEnumerable CompletedInstallations + { get { return CompletedInstallationsInternal; } } @@ -163,8 +164,8 @@ namespace Emby.Server.Implementations.Updates { var data = new Dictionary { - { "key", _securityManager.SupporterKey }, - { "mac", _applicationHost.SystemId }, + { "key", _securityManager.SupporterKey }, + { "mac", _applicationHost.SystemId }, { "systemid", _applicationHost.SystemId } }; @@ -656,6 +657,8 @@ namespace Emby.Server.Implementations.Updates // Remove it the quick way for now _applicationHost.RemovePlugin(plugin); + _logger.Info("Deleting plugin file {0}", plugin.AssemblyFilePath); + _fileSystem.DeleteFile(plugin.AssemblyFilePath); OnPluginUninstalled(plugin); diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index a84e9a5d23..943c9d8822 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -103,6 +103,16 @@ namespace MediaBrowser.Controller.Entities } } + public override bool CanDelete() + { + if (IsRoot) + { + return false; + } + + return base.CanDelete(); + } + public override bool RequiresRefresh() { var baseResult = base.RequiresRefresh(); -- cgit v1.2.3