| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 | using MediaBrowser.Model.Logging;using NLog;using NLog.Config;using NLog.Targets;using NLog.Targets.Wrappers;using System;using System.IO;using System.Linq;namespace MediaBrowser.Common.Implementations.Logging{    /// <summary>    /// Class NlogManager    /// </summary>    public class NlogManager : ILogManager    {        /// <summary>        /// Occurs when [logger loaded].        /// </summary>        public event EventHandler LoggerLoaded;        /// <summary>        /// Gets or sets the log directory.        /// </summary>        /// <value>The log directory.</value>        private string LogDirectory { get; set; }        /// <summary>        /// Gets or sets the log file prefix.        /// </summary>        /// <value>The log file prefix.</value>        private string LogFilePrefix { get; set; }        /// <summary>        /// Gets the log file path.        /// </summary>        /// <value>The log file path.</value>        public string LogFilePath { get; private set; }        /// <summary>        /// Gets or sets the exception message prefix.        /// </summary>        /// <value>The exception message prefix.</value>        public string ExceptionMessagePrefix { get; set; }        /// <summary>        /// Initializes a new instance of the <see cref="NlogManager" /> class.        /// </summary>        /// <param name="logDirectory">The log directory.</param>        /// <param name="logFileNamePrefix">The log file name prefix.</param>        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);                }            }        }        /// <summary>        /// Adds the file target.        /// </summary>        /// <param name="path">The path.</param>        /// <param name="level">The level.</param>        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);        }        /// <summary>        /// Adds the log target.        /// </summary>        /// <param name="target">The target.</param>        /// <param name="level">The level.</param>        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;        }        /// <summary>        /// Removes the target.        /// </summary>        /// <param name="name">The name.</param>        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;            }        }        /// <summary>        /// Gets the logger.        /// </summary>        /// <param name="name">The name.</param>        /// <returns>ILogger.</returns>        public ILogger GetLogger(string name)        {            return new NLogger(name, this);        }        /// <summary>        /// Gets the log level.        /// </summary>        /// <param name="severity">The severity.</param>        /// <returns>LogLevel.</returns>        /// <exception cref="System.ArgumentException">Unrecognized LogSeverity</exception>        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");            }        }        /// <summary>        /// Reloads the logger.        /// </summary>        /// <param name="level">The level.</param>        public void ReloadLogger(LogSeverity level)        {            LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(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);                }            }        }        /// <summary>        /// Flushes this instance.        /// </summary>        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");        }    }}
 |