/// <summary> /// Получение специфического набора логирования /// </summary> /// <param name="sourceMarker">Маркер - источник логирования (для статических типов)</param> /// <param name="flag">Флаг набора (если известен)</param> /// <returns>Возвращает набор логирования для класса</returns> public static LogSet GetLogSet(string sourceMarker, string flag) { LogSet newSet = null; if (string.IsNullOrEmpty(sourceMarker)) { sourceMarker = "UnKnownSource"; } if (flag == null) { if (Settings != null) { flag = Settings.LogSetFlag; } } if (!LogSetFlags.IsCorrectFlag(flag)) { flag = DefaultLogSetFlag; } try { if (m_logSets.ContainsKey(flag)) { newSet = m_logSets[flag].GetCopy(); } else { newSet = Get_LogSetByFlag(flag); m_logSets.Add(flag, newSet); } } catch (Exception ex) { WindowsLoger.LogError(winLogSource, "Возникло исключение при получении набора логирования для класса. Возвращён набор по умолчанию", ex, new LogParameter("Логируемый тип", sourceMarker) , new LogParameter("Флаг набора", flag == null ? "NULL" : flag)); newSet = GetDefaultLogSet(); } //ссылаемся на статическое всойство, т.к. предполагается, //что при первой загрузке кода в Домене, будут проставлены необходимые свойства //или впоследствии могут поменяться newSet.Settings = Settings; //добавляем имя класса при логировании сообщений newSet.AddParameter(new LogParameter("Тип", sourceMarker)); newSet.AddParameter(new LogParameter("Пользователь", Environment.UserName)); return(newSet); }
/// <summary> /// Конкатинация параметров логирования /// </summary> /// <param name="sb">Экземпляр StringBuilder для конкатинации</param> /// <param name="parameters">Коллекция параметров</param> /// <param name="paramsHeader">Заголовок секции с параметрами</param> /// <param name="indent">Отступ для строк</param> /// <returns>Возвращает использованный для конкатинации экземпляр StringBuilder</returns> public static StringBuilder BuildParameters(StringBuilder sb, ILogParameter[] parameters, string paramsHeader = null, string indent = "") { if (sb == null) { sb = new StringBuilder(); } try { if (paramsHeader == null) { paramsHeader = DefaultParametersHeader; } if (parameters == null || parameters.Length == 0) { return(sb); } sb.Append(indent).AppendLine(paramsHeader); ILogParameter p = null; for (int i = 0; i < parameters.Length; i++) { p = parameters[i]; if (p == null) { continue; } try { p.AppendParameter(sb, indent); } catch (Exception ex) { AppendLogParameterException(sb, p, ex, paramsHeader, indent, i); } } } catch (Exception ex) { string msg = "Возникло исключение при сборке параметров лог-сообщения"; sb.Append(indent).AppendLine(msg); AppendException(sb, ex, indent); WindowsLoger.LogError(WinLogerSource, msg, ex); } return(sb); }
static LogSet GetDefaultLogSet() { try { var set = new LogSet(); set.AddLoger(new WindowsLoger(WinLogSource)); return(set); } catch (Exception ex) { WindowsLoger.LogError(winLogSource, "Возникло исключение при генерации набора логирования по умолчанию. Возвращена пустая ссылка на Набор. Возможен вал непредвиденных ошибок.", ex); return(null); } }
/// <summary> /// Логирование сообщения в указанный файл /// </summary> /// <param name="pathName">Путь к файлу</param> /// <param name="message">Сообщение для логирования</param> /// <param name="parameters">Параметры логирования</param> public void Log(string pathName, string message, params ILogParameter[] parameters) { try { var logMessage = LogMessageBuilder.BuildMessage(message, parameters: parameters); logMessage = BuildFileMessage(logMessage); File.AppendAllText(pathName, logMessage); } catch (Exception ex) { WindowsLoger.LogError(LogSource, "Возникло исключение при логировании в файл", ex); if (LogerError != null) { LogerError(this); } } }
/// <summary> /// Запись информации об исключении в журнал логирования Windows /// </summary> /// <param name="source">Наименование источника (обязательно) (любое имя для идентификации источника в Журнале)</param> /// <param name="message">Описание</param> /// <param name="messageType">Тип сообщения</param> /// <exception cref="ArgumentNullException">Указание источника обязательно</exception> public static void LogMessage(string source, string message, EventLogEntryType messageType, string logName, params ILogParameter[] parameters) { var loger = new WindowsLoger(source); loger.LogMessage(message, messageType, parameters: parameters); }
/// <summary> /// Логика логирования сообщений /// </summary> /// <param name="message">Сообщение</param> /// <param name="ex">Исключение</param> /// <param name="type">Статус сообщения</param> /// <param name="loger">Логер, через который логируем. Null - логируем через всех</param> /// <param name="single">Логировать только через указанный логер или через указанный и прочие, указанные в коллекции</param> /// <param name="force">Принудительно логирование (текущий уровень логирования не учитывается)</param> /// <param name="parameters">Параметры для логирования</param> private void InternalLog(string message, Exception ex, MessageType type, ILoger loger, bool single, bool force, params ILogParameter[] parameters) { /* * основная логика логирования в проекте */ //не пытаемся логировать при возникновении исключения в прошлый раз //если какой-то косяк - логирование прекращаем, чтобы не логировать миллион раз в случае чего if (m_logError) { return; } try { //для НЕ принудительнологируемых //проверяем, есть ли разрешение на логирование if (!force) { if (!IsLogable(type)) { return; } } //добавляем общие параметры для LogSet к текущим, переданным пользователем ILogParameter[] setParams = ConcatParameters(parameters); bool logByAll = loger == null; //если конкретный логер не указан, полюбому логируем всеми if (loger != null) //если указан логер, логируем через него { if (ex == null) { loger.Log(message, type, setParams); } else { loger.Log(message, ex, type, setParams); } logByAll = !single; //если не указан single, логируем также и прочими } if (logByAll) //логируем всеми логерами в наборе { foreach (var pack in m_logers) { //проверяем, есть ли разрешение для текущего логера if (pack.MessageTypes != null) { if (!force) { if (!IsLogable(pack.MessageTypes)) { continue; } } } //добавляем параметры текущего логера if (pack.AdditionalProperties != null) { setParams = ConcatParameters(pack.AdditionalProperties, setParams); } //логируем if (ex == null) { pack.Loger.Log(message, type, setParams); } else { pack.Loger.Log(message, ex, type, setParams); } } } } catch (Exception logEx) { m_logError = true; if (ex != null) { WindowsLoger.LogError("LogSet", message, ex, parameters); } else { WindowsLoger.LogMessage("LogSet", message, WindowsLoger.GetWindowsLogType(type), parameters); } WindowsLoger.LogError("LogSet", "Возникло исключение при попытке записи в журнал логирования", logEx); if (LogerError != null) { LogerError(this); } } }