Страница 1 из 1

StiLogService: нужна возможность прицепиться своим логгером

Добавлено: 06 мар 2009, 06:21
ppvlad
Здравствуйте, уважаемые коллеги.

Как известно, исключения генератора направляются в StiLogService, который умеет сбрасывать
их в файл и в System.Diagnostics.Trace

Однако нередким является использовнание приложением своего логгера, реализующего требуемый регламент
обработки ошибок.

Хотелось бы иметь возможность прицепиться своим логгером к StiLogService (как угодно, например
подписаться на его событие или зарегистрировать своего листнера - не важно), главное
дотянуться до исключения, которое может быть сожрано генератором, но перед этим
направлено в StiLogService. Разумеется при этом надо видеть ошибка это или просто генератору
поговорить хочется...

Такие исключения есть, пример навскидку: у нас есть отчёты прекрасно работающие из-под XP и не работающие в 98,
при этом никаких сообщений об ошибках нет, бодро проходит прогресс формирования страниц и тишина, нет превью, нет ошибок,
а в лог при этом (если его включить) сбрасываются вполне конкретные исключения про ошибки рендеринга.

Однако глупо иметь свой единый логгер приложения, а ошибки генератора искать где-то в дебрях файловой системы,
хочется и их направить на путь истинный, а вот не предусмотрено это в StiLogService...

Уверен, что разработчики нас поддержат, фича полезная и не сложно реализуемая.




Посмотрите, на какие извраты приходится идти, чтобы реализовать это в существующей архитектуре генератора:
приходится включать в StiLogService трассировку, вешать своего листнера в глобальный трассировщик, потом
придумывать как отфильтровать нужные сообщения (а никак, кроме как по внешнему виду... ужос...)
и перенаправлять их уже куда надо...

Код: Выделить всё

System.Diagnostics.Trace.Listeners.Add(new ReportingTraceListener());
Stimulsoft.Report.StiLogService.TraceEnabled = true;

/// 
/// Слушатель событий трассировки, пытающийся выловить сообщения об ошибках генератора отчётов
/// и перенеправить их в стандартный лог приложения.
/// Временное решение, используемое в отсутствии поддержки CustomLog генератором отчётов.
/// 
public class ReportingTraceListener : System.Diagnostics.TraceListener
{
	public override void Write(string message)
	{
	    internalWriteLine(message);
	}

	public override void WriteLine(string message)
	{
	    internalWriteLine(message);
	}

	private void internalWriteLine(string message)
	{
	    if (isStiReportError(message))
	    {
	        PDPLog.Error(message); //  0) &&
	        (message.IndexOf("Method : [") > 0) &&
	        (message.IndexOf("====================================================") > 0);
	}
}

Дорогие товарищи разработчики, учтите наше пожелание и сделайте
поддержку CustomLog в генераторе. Спасибо заранее.

StiLogService: нужна возможность прицепиться своим логгером

Добавлено: 06 мар 2009, 12:45
Jan
Здравствуйте,
ppvlad писал(а): Дорогие товарищи разработчики, учтите наше пожелание и сделайте
поддержку CustomLog в генераторе. Спасибо заранее.
Вам нужна возможность получить информацию о всех исключениях? В каком виде наиболее удобнее будет ее получать?

Спасибо.

StiLogService: нужна возможность прицепиться своим логгером

Добавлено: 10 мар 2009, 03:37
ppvlad
В том примере, что я привёл, ловится именно то, что нам надо, то есть исключения,
которые имеет смысл видеть, это нас устраивает.
Но, возможно, кому-то захочется видеть все сообщения трассировки.

Я приведу как это видится снаружи, пользователю генератора, поскольку внутренние решения
этих задач разработчикам наверняка очевидны.

Не меняя архитектуру StiLogService, при решении своей узкой задачи - увидеть почему не работает отчёт, было бы
достаточно иметь само сообщение (сформированное методами
public static void Write(Type type, string message)
public static void Write(Type type, Exception e)
public static void Write(string message)
) и признак (достаточно bool isException) на основании которого можно было отличить проблемы от
прочего потока сознания генератора.

Выглядело бы это снаружи примерно так:

Код: Выделить всё

Stimulsoft.Report.StiLogService.OnCustomLog += new CustomLogEventHandler(logEventHandler);
Stimulsoft.Report.StiLogService.CustomLogEnabled = true;

public delegate CustomLogEventHandler(string message, bool isException);

...
        private void logEventHandler(string message, bool isException)
        {
            // отправляем в свой логгер в нужном нам виде
            // при необходимости, сдесь-же отфильтруем что нам интересно...
            if (isException) 
            {
                 MyCustomLog.Error(message);
            }
            else
            {
                 MyCustomLog.Info(message);
            }
        }

Ну а если менять StiLogService (чисто гипотетически, реальной нужды в этом нет), наверное замутить что-нибудь этакое:

Код: Выделить всё

public enum LogMessageCategory { Info, Warning, Error, Exception };

public delegate CustomLogEventHandler(LogMessageCategory category, string message, Exception e);

Stimulsoft.Report.StiLogService.OnCustomLog += new CustomLogEventHandler(logEventHandler);
Stimulsoft.Report.StiLogService.CustomLogEnabled = true;

...

        private void logEventHandler(LogMessageCategory category, string message, Exception e)
        {
            // отправляем в свой логгер в нужном нам виде
            // при необходимости, сдесь-же отфильтруем что нам интересно...
            switch (category)
            {
                case LogMessageCategory.Info:
                    MyCustomLog.Info(message);
                    break;
                case LogMessageCategory.Warning:
                    MyCustomLog.Warning(message);
                    break;
                case LogMessageCategory.Error:
                    MyCustomLog.Error(message);
                    break;
                case LogMessageCategory.Exception:
                    MyCustomLog.Exception(e);
                    break;
            }
        }
в этом решении я исхожу из того, что в пишущих методах StiLogService

public static void Write(string message)
public static void Write(Type type, string message)
public static void Write(Type type, Exception e)

аргумент type интереса не представляет (служит для формирования message),
аргумент Exception e может быть интересен внешнему логгеру сам по себе,
соответственно снаружи интересно знать message и exception, а про message
имеет смысл обладать дополнительной информацией насколько серьёзен был
генератор, формируя его (LogMessageCategory)


Ещё раз повторюсь, что на втором решении я не настаиваю, лично мне более чем достаточно первого,
тем более что для него менять совсем немного и только в StiLogService.

в качестве компромиссного варианта наверное идеальным было бы такое:

Код: Выделить всё

public delegate CustomLogEventHandler(string message, Exception e);

...

        private void logEventHandler(string message, Exception e)
        {
            // отправляем в свой логгер в нужном нам виде
            // при необходимости, сдесь-же отфильтруем что нам интересно...
            if (e != null) 
            {
                 MyCustomLog.Exception(e);
            }
            else
            {
                 MyCustomLog.Info(message);
            }
        }

StiLogService: нужна возможность прицепиться своим логгером

Добавлено: 10 мар 2009, 07:00
Edward
Здравствуйте

Большое спасибо за подробный ответ. Сразу после релиза 2009.1, в начале апреля, мы сможем учесть эти пожелания.

Спасибо.