/// <summary> /// Логирование Параметра по умолчанию: "Имя: @Name@@Delimeter@Value:@Value@\r\n" /// </summary> /// <param name="p">Параметр</param> /// <param name="indent">Отступ</param> /// <returns>Возвращает новый экземпляр StringBuilder со схемой по умолчанию</returns> public static StringBuilder DefaultAppendParameter(StringBuilder sb, ILogParameter p, string indent = "") { if (sb == null) { sb = new StringBuilder(); } if (p == null) { return(sb); } var lpwd = p as ILogParamWithDelimiter; string delimiter = lpwd == null ? DefaultDelimiter : lpwd.Delimiter; try { sb.Append(indent).Append(p.Name).Append(delimiter).AppendLine(p.Value); } catch (Exception ex) { AppendLogParameterException(sb, p, ex, DefaultParametersHeader, indent, -1); } return(sb); }
static void AppendLogParameterException(StringBuilder sb, ILogParameter p, Exception ex, string paramsHeader, string indent, int index) { /* * логируем исключение при добавлении параметра в сообщение * * возможно получется невротбольшой лог - надеемся, что всё будет ок */ string exCase = "<getException>"; string pName = exCase; string pValue = exCase; //чуть отступаем для вложенных исключений var subExIndent = indent + " "; var nameValueIndent = subExIndent + " "; try { pName = p.Name; } catch (Exception nameEx) { sb.Append(BuildMessage("Возникло исключение при получении имени параметра логирования", nameEx, paramsHeader, nameValueIndent , new LogParameter("Тип параметра", p.GetType().FullName))); } try { pValue = p.Value; } catch (Exception valueEx) { //если с именем проблем не было, логируем ещё и имя var valueParams = pName == exCase ? new LogParameter[] { new LogParameter("Тип параметра", p.GetType().FullName) } : new LogParameter[] { new LogParameter("Тип параметра", p.GetType().FullName), new LogParameter("Имя параметра", p.Name) }; sb.Append(BuildMessage("Возникло исключение при получении значения параметра логирования", valueEx, paramsHeader, nameValueIndent , valueParams)); } //если с именем и значением проблем не было, логируем ещё их var subExParams = new List <LogParameter>(); subExParams.Add(new LogParameter("Тип параметра", p.GetType().FullName)); subExParams.Add(new LogParameter("Индекс параметра", index.ToString())); if (pName != exCase) { subExParams.Add(new LogParameter("Имя параметра", pName)); } if (pValue != exCase) { subExParams.Add(new LogParameter("Значение параметра", pValue)); } sb.Append(BuildMessage("Возникло исключение при построении сообщения логирования для параметра", ex, paramsHeader, subExIndent , subExParams.ToArray())); }
/// <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); }
/// <summary> /// Добавляет параметр при логировании /// </summary> /// <param name="logParam">Добавляемый параметр</param> public void AddParameter(ILogParameter logParam) { m_parameters.Add(logParam); }