/// <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); } }
/// <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()); }
/// <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; }