/// <summary>
 /// Initializes a new instance of the <see cref="LoggingConfig"/> class.
 /// </summary>
 /// <param name="configString">The config string.</param>
 /// <param name="createLogger">The create logger.</param>
 /// <param name="updateLogger">The update logger.</param>
 public LoggingConfig(string configString, CallbackCreateLogger createLogger, CallbackUpdateLogger updateLogger)
 {
     Load(configString, createLogger, updateLogger);
     InitializeCurrent();
 }
        /// <summary>
        /// Loads the specified config string.
        /// </summary>
        /// <example>Namespace1.Class1=*;Class2=off;Namespace1.Namespace2.Class3=Debug</example>
        /// <param name="configString">The config string.</param>
        /// <param name="createLogger">The create logger.</param>
        /// <param name="updateLogger">The update logger.</param>
        public virtual void Load(string configString, CallbackCreateLogger createLogger, CallbackUpdateLogger updateLogger)
        {
            m_value = configString;

            if (createLogger == null && m_createLogger == null)
            {
                createLogger = DefaultCallbackCreateLogger;
            }
            if (updateLogger == null && m_updateLogger == null)
            {
                updateLogger = DefaultCallbackUpdateLogger;
            }

            if (m_createLogger == null)
            {
                m_createLogger = createLogger;
            }

            if (m_updateLogger == null)
            {
                m_updateLogger = updateLogger;
            }

            DisableAllLoggers();

            if (configString != null && Enabled)
            {
                string[] pieces = configString.Trim().Split(';', ',');
                if (pieces.Length == 1 && pieces[0] == "")
                {
                    return;
                }
                foreach (string piece in pieces)
                {
                    string[] parts = piece.Trim().Split('=');
                    if (parts != null && parts.Length > 0 && parts.Length <= 2 && parts[0].Trim().Length > 0)
                    {
                        string key = parts[0].ToLower().Trim();

                        if (key == AllLoggersDesignatorSplat)
                        {
                            key = AllLoggersDesignator;
                        }

                        string val = parts.Length == 1 ? AllLoggersDesignatorSplat : parts[1];
                        LoggerSeverity threshold = GetLogValue(val);
                        Logger logger;

                        if (key == AllLoggersDesignator)
                        {
                            // Updating all loggers
                            foreach (Logger logval in m_loggers.Values)
                            {
                                m_updateLogger(logval, threshold);
                                PrepareLogger(threshold, logval);
                            }
                        }

                        // See if the logger already exists
                        if (m_loggers.TryGetValue(key, out logger))
                        {
                            // Already exists
                            m_updateLogger(logger, threshold);

                            PrepareLogger(threshold, logger);
                        }
                        else
                        {
                            logger = m_createLogger(key, threshold);

                            PostProcessNewLogger(key, threshold, logger);
                        }
                    }
                    else
                    {
                        throw new ArgumentException(string.Format("Check format of log string ({0}).", piece));
                    }
                }
            }
        }
        /// <summary>
        /// Gets the <see cref="PublicDomain.Logging.Logger"/> with the specified log class.
        /// </summary>
        /// <param name="logClasses">The log classes.</param>
        /// <returns></returns>
        /// <value></value>
        public virtual Logger CreateLogger(params string[] logClasses)
        {
            Logger result = null;
            Logger test;

            // First try the specific classes
            if (logClasses != null)
            {
                string logClass;
                for (int i = 0; i < logClasses.Length; i++)
                {
                    logClass = logClasses[i].ToLower().Trim();
                    if (m_loggers.TryGetValue(logClass, out test))
                    {
                        result = test;
                        break;
                    }
                }
            }

            // Lastly try the all designator
            if (result == null && m_loggers.TryGetValue(AllLoggersDesignator, out test))
            {
                result = test;
            }

            if (result == null)
            {
                if (FallbackToNullLogger)
                {
                    result = NullLogger.Current;
                }
                else
                {
                    if (logClasses == null || logClasses.Length == 0)
                    {
                        throw new ArgumentNullException("Could not create fallback logger because no logClasses were specified");
                    }

                    // A fallback logger is always turned off
                    LoggerSeverity fallbackThreshold = OffValue;
                    string key = logClasses[0];

                    if (m_createLogger == null)
                    {
                        m_createLogger = DefaultCallbackCreateLogger;
                    }
                    result = m_createLogger(key, fallbackThreshold);

                    key = key.ToLower();

                    PostProcessNewLogger(key, fallbackThreshold, result);

                    UpdatePeerLoggers(logClasses, result, key);
                }
            }

            return result;
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="LoggingConfig"/> class.
 /// </summary>
 /// <param name="configString">The config string.</param>
 /// <param name="createLogger">The create logger.</param>
 /// <param name="updateLogger">The update logger.</param>
 public LoggingConfig(string configString, CallbackCreateLogger createLogger, CallbackUpdateLogger updateLogger)
 {
     Load(configString, createLogger, updateLogger);
     InitializeCurrent();
 }
        /// <summary>
        /// Gets the <see cref="Utilities.Logging.Logger"/> with the specified log class.
        /// </summary>
        /// <param name="logClasses">The log classes.</param>
        /// <returns></returns>
        /// <value></value>
        public virtual Logger CreateLogger(params string[] logClasses)
        {
            Logger result = null;

            Logger test;
            string testClass;

            // First try the specific classes
            if (logClasses != null)
            {
                foreach (string logClass in logClasses)
                {
                    testClass = logClass.ToLower().Trim();
                    if (m_loggers.TryGetValue(testClass, out test))
                    {
                        result = test;
                        break;
                    }
                }
            }

            // Lastly try the all designator
            if (result == null && m_loggers.TryGetValue(AllLoggersDesignator, out test))
            {
                result = test;
            }

            if (result == null)
            {
                if (FallbackToNullLogger)
                {
                    result = NullLogger.Current;
                }
                else
                {
                    if (logClasses.Length == 0)
                    {
                        throw new ArgumentNullException("Could not create fallback logger because no logClasses were specified");
                    }

                    // A fallback logger is always turned off
                    LoggerSeverity fallbackThreshold = OffValue;
                    string         key = logClasses[0];

                    if (m_createLogger == null)
                    {
                        m_createLogger = DefaultCallbackCreateLogger;
                    }
                    result = m_createLogger(key, fallbackThreshold);

                    key = key.ToLower();

                    PostProcessNewLogger(key, fallbackThreshold, result);

                    for (int i = 1; i < logClasses.Length; i++)
                    {
                        m_loggers[logClasses[i]] = result;
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// Loads the specified config string.
        /// </summary>
        /// <example>Namespace1.Class1=*;Class2=off;Namespace1.Namespace2.Class3=Debug</example>
        /// <param name="configString">The config string.</param>
        /// <param name="createLogger">The create logger.</param>
        /// <param name="updateLogger">The update logger.</param>
        public virtual void Load(string configString, CallbackCreateLogger createLogger, CallbackUpdateLogger updateLogger)
        {
            m_value = configString;

            if (createLogger == null)
            {
                createLogger = DefaultCallbackCreateLogger;
            }
            if (updateLogger == null)
            {
                updateLogger = DefaultCallbackUpdateLogger;
            }

            m_createLogger = createLogger;
            m_updateLogger = updateLogger;

            DisableAllLoggers();

            if (configString != null && Enabled)
            {
                string[] pieces = configString.Trim().Split(';', ',');
                if (pieces.Length == 1 && pieces[0] == "")
                {
                    return;
                }
                foreach (string piece in pieces)
                {
                    string[] parts = piece.Trim().Split('=');
                    if (parts != null && parts.Length > 0 && parts.Length <= 2 && parts[0].Trim().Length > 0)
                    {
                        string key = parts[0].ToLower().Trim();

                        if (key == AllLoggersDesignatorSplat)
                        {
                            key = AllLoggersDesignator;
                        }

                        string         val       = parts.Length == 1 ? AllLoggersDesignatorSplat : parts[1];
                        LoggerSeverity threshold = GetLogValue(val);
                        Logger         logger;

                        // See if the logger already exists
                        if (m_loggers.TryGetValue(key, out logger))
                        {
                            // Already exists
                            m_updateLogger(logger, threshold);

                            PrepareLogger(threshold, logger);
                        }
                        else
                        {
                            logger = m_createLogger(key, threshold);

                            PostProcessNewLogger(key, threshold, logger);
                        }
                    }
                    else
                    {
                        throw new ArgumentException(string.Format("Check format of log string ({0}).", piece));
                    }
                }
            }
        }