Example #1
0
        /// <summary>
        /// Чтение конфигурации логирования
        /// </summary>
        private void ReadConfiguration()
        {
            LoggingInfrastructureSection loggingInfrastructureConfigurationSection = null;

            try
            {
                loggingInfrastructureConfigurationSection = ConfigurationManager.GetSection(ConfigurationSectionName) as LoggingInfrastructureSection;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }

            if (loggingInfrastructureConfigurationSection == null)
            {
                loggingInfrastructureConfigurationSection           = new LoggingInfrastructureSection();
                loggingInfrastructureConfigurationSection.Loggers   = new LoggerElementCollection();
                loggingInfrastructureConfigurationSection.Listeners = new ListenerElementCollection();
                loggingInfrastructureConfigurationSection.Loggers.Add(new LoggerElement());
            }

            IsDebug = loggingInfrastructureConfigurationSection.Debug;

            var newLogger = ReadConfiguration(loggingInfrastructureConfigurationSection);

            if (newLogger != null)
            {
                AddLogger(newLogger);
            }
        }
Example #2
0
        /// <summary>
        /// Чтение секции конфигурации логирования
        /// </summary>
        /// <param name="sectionConfig">Секция логгирования из конфигурации</param>
        /// <returns></returns>
        private static ILogger ReadConfiguration(LoggingInfrastructureSection sectionConfig)
        {
            var listenerElements = sectionConfig.Listeners.OfType <ListenerElement>().EmptyIfNull().ToList();
            var loggers          = sectionConfig.Loggers.OfType <LoggerElement>().EmptyIfNull().Where(el => el != null).ToList();

            if (!loggers.Any())
            {
                var newLogger = new Logger();
                ReadListeners(newLogger, listenerElements);
                return(newLogger);
            }

            foreach (var loggerElement in loggers)
            {
                var newLogger = CreateLogger(loggerElement) ?? new Logger();

                ReadListeners(newLogger, listenerElements);
                return(newLogger);
            }
            return(new Logger());
        }
Example #3
0
        /// <summary>
        /// Метод выполняет мердж настроек из сервиса и локальных
        /// - Заменяет листенер в локальнх настройках при совпаденнни
        /// - Добавляет те листенеры которых нет в локальных настройках
        /// - Заменяет логальный список атрибутов для скрытия на список из сервиса
        /// </summary>
        /// <param name="sectionFromLoadedConfig">Секция настроек десериализованная из строки из бд</param>
        /// <param name="logger">Логгер</param>
        public static void ReconfigureLogging(LoggingInfrastructureSection sectionFromLoadedConfig, ILogger logger)
        {
            var localListeners = logger.Listeners.ToList();

            //ToDo: Костыль, продумать как лучше подменять файлы для записи логов
            try
            {
                foreach (var localListener in localListeners)
                {
                    foreach (var adapter in localListener.Adapters.Where(adapter => adapter is IFileLogAdapter))
                    {
                        var localPath = ((IFileLogAdapter)adapter).FilePath;
                        localPath = ((IFileLogAdapter)adapter).ReplaceEnvironmentVariable(localPath); //Преобразуем путь если указаны переменные
                        if (File.Exists(localPath))
                        {
                            var firstLogs = File.ReadAllText(localPath, Encoding.UTF8);

                            //Поскольку имя файла в конфигурации из бд может быть таким же, то записываем все первоначальные логи во временные файлы
                            var tempPath = localPath + ".tmp";
                            File.WriteAllText(tempPath, firstLogs, Encoding.UTF8);
                            _tempLogFiles.Add(tempPath); //Копируем логи которые были уже записаны для адаптеров локально

                            var listenerElements = sectionFromLoadedConfig.Listeners.OfType <ListenerElement>().EmptyIfNull().ToList();
                            foreach (var listenerElement in listenerElements)
                            {
                                //Берем те листенеры которые будут заменены на листенеры конфигурации из бд,
                                //Закрываем адаптеры(для записи в файл), удаляем их, чтобы при пересоздании с такиж именем для листенеров из бд не создавался дополнительный файл
                                //Для адаптеров из бд которые не будут перезаписаны, скопированы логи для вставки
                                if (listenerElement.Name != localListener.Name)
                                {
                                    continue;
                                }

                                ((IFileLogAdapter)adapter).CloseAppender();

                                for (var i = 0; i < TryCountDeleteFile; i++)
                                {
                                    try
                                    {
                                        File.Delete(localPath);
                                        break;
                                    }
                                    catch (Exception)
                                    {
                                        Thread.Sleep(AttemptsWhaitingTime);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.ErrorDev(ex, new LoggingCategory("LoggingConfiguration"), "Error in reconfiguration method", null, null);
            }

            var loggerFromAdminConfiguration = ReadConfiguration(sectionFromLoadedConfig);

            if (loggerFromAdminConfiguration == null)
            {
                throw new Exception("Не удалось загрузить конфигурацию");
            }


            foreach (var listener in loggerFromAdminConfiguration.Listeners)
            {
                if (localListeners.Any(x => String.Equals(x.Name, listener.Name, StringComparison.CurrentCultureIgnoreCase)))
                {
                    var localListener = localListeners.FirstOrDefault(
                        x => String.Equals(x.Name, listener.Name, StringComparison.CurrentCultureIgnoreCase));
                    localListeners.Remove(localListener);
                }
                localListeners.Add(listener);
                logger.AddListener(listener);
            }

            foreach (var adapter in logger.Listeners.SelectMany(x => x.Adapters.Where(adapter => adapter is IFileLogAdapter)))
            {
                ((IFileLogAdapter)adapter).IsFirstFlushDone += IsFirstFlushDone;
            }

            logger.AttributesToHide = loggerFromAdminConfiguration.AttributesToHide;
        }