/// <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);
        }
Exemple #4
0
 /// <summary>
 /// Добавляет параметр при логировании
 /// </summary>
 /// <param name="logParam">Добавляемый параметр</param>
 public void AddParameter(ILogParameter logParam)
 {
     m_parameters.Add(logParam);
 }