powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Логирование
55 сообщений из 55, показаны все 3 страниц
Логирование
    #38474820
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть сайт. Хочу отлавливать всякие исключения, чтобы юзеру выдавалась страница типа "Опаньки!.. Но мы уже работаем над этим.", а на сервере писался лог, где бы было и что за юзер, какой метод какого контроллера вызвал и с какими параметрами. И подробные сведения об исключении. И чтобы сохранялось это всё в удобном формате (наверное, XML) - чтобы можно было легко написать просмотрщик таких исключений из лога, чтобы руками не разгребать все эти логи.

Ну так вот, два вопроса:

1. Хорошая ли это идея, отлавливать ошибки таким методом? Я, конечно, потыкаю интерфейс и даже, наверное, кое-где юнит-тесты напишу. Но всё же?

2. С помощью чего можно это сделать? Нашёл вот что - оно решит мою задачу? Там в принципе написано, как логировать все обращения юзеров к сайту и вообще все исключения?
...
Рейтинг: 0 / 0
Логирование
    #38474843
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, опять не в тот раздел. Надо бы в ASP.NET перенсти. Перенесите, пожалуйста.

Добавлю, что хостинг на IIS, сайт - на ASP.NET MVC.
...
Рейтинг: 0 / 0
Логирование
    #38474844
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
1. "Опаньки" можно сделать стандартными методами, подменяя стандартные сообщения веб-сервера. Ничего нового.
2. С помощью перехвата ошибок (try...catch) и их логирования
...
Рейтинг: 0 / 0
Логирование
    #38474853
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat21. "Опаньки" можно сделать стандартными методами, подменяя стандартные сообщения веб-сервера. Ничего нового.
2. С помощью перехвата ошибок (try...catch) и их логирования
Перехват трай-кетчем - это надо весь код в эти трай-кетчи запихать. Получится захламленный код. Хочу, чтобы это было что-то типа включения галочки в настройках проекта сайта - "перехватывать исключения и в нужном формате писать их в лог".

Может, у IIS или там ASP.NET MVC есть свои встроенные средства для этого?

Поискал тут - http://www.sql.ru/forum/actualsearch.aspx?search=???*&sin=1&bid=-3&a=&ma=0&dt=-1&s=1&so=1
нашлось совсем мало тем, и большая часть - древность. Ещё какой-то Health Monitor рекомендуют - он мне поможет?
...
Рейтинг: 0 / 0
Логирование
    #38474854
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
авторОпаньки!.. Но мы уже работаем над этим.
ОООоооо, вам солнцеликий угол заказал..

Код: c#
1.
2.
3.
4.
5.
   protected void Application_Error() {
   Exception lastException = Server.GetLastError();
   NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
   logger.Fatal(lastException);
}


NLog через nuget оформить
...
Рейтинг: 0 / 0
Логирование
    #38474858
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
авторОпаньки!.. Но мы уже работаем над этим.
ОООоооо, вам солнцеликий угол заказал..

Код: c#
1.
2.
3.
4.
5.
   protected void Application_Error() {
   Exception lastException = Server.GetLastError();
   NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
   logger.Fatal(lastException);
}


NLog через nuget оформить
А что лучше - NLog или это ?
...
Рейтинг: 0 / 0
Логирование
    #38474870
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
log4net,nlog , "это" че то не осилил читать, да и не вижу смысла, первых двух хватает,
...
Рейтинг: 0 / 0
Логирование
    #38474876
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
а вот у меня чисто научный и в то же время риторический вопрос, Вы когда по этой теме в гугле искали, вы что набирали в поисковой строке?
...
Рейтинг: 0 / 0
Логирование
    #38474881
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл такие рассуждения - сравнение log4net, Nlog и Enterprice Library. Кто что о них думает?
...
Рейтинг: 0 / 0
Логирование
    #38474884
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Нашёл такие рассуждения - сравнение log4net, Nlog и Enterprice Library. Кто что о них думает?
Но это как-то старО. Вот нашёл поновее https://essentialdiagnostics.codeplex.com/wikipage?title=Comparison
...
Рейтинг: 0 / 0
Логирование
    #38474885
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
а вот у меня чисто научный и в то же время риторический вопрос, Вы когда по этой теме в гугле искали, вы что набирали в поисковой строке?
Я сначала тут поискал. Потом создал тему. Потом полез в Гугл (результат выше). Плохо, да? (((
...
Рейтинг: 0 / 0
Логирование
    #38474891
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
а у гула вы как спросили, меня не алгоритм поиска интересует, а вопрос к гуглу..
...
Рейтинг: 0 / 0
Логирование
    #38474893
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
авторЯ сначала тут поискал. Потом создал тему. Потом полез в Гугл (результат выше). Плохо, да? (((
да нет, не плохо, я бы сказал обычно...., ну если добавить, то многие просто тему создают, а потом искать лезут..
...
Рейтинг: 0 / 0
Логирование
    #38474912
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
а у гула вы как спросили, меня не алгоритм поиска интересует, а вопрос к гуглу..
"msdn logging"
Я сразу старался найти общепринятые практики, а не что-то из вида "CodeProjet - My own (and 151st over the world) approach to logging". Всё же, тема явно давно известная и должна иметь "общепринятые" наработки. А МС славится тем, что общепринятые наработки включает в свои фреймворки как готовые решения.
...
Рейтинг: 0 / 0
Логирование
    #38474920
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
авторА МС славится тем, что общепринятые наработки включает в свои фреймворки как готовые решения.
всем решарпозависимым посвящается
YouTube Video
...
Рейтинг: 0 / 0
Логирование
    #38474942
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
авторА МС славится тем, что общепринятые наработки включает в свои фреймворки как готовые решения.
всем решарпозависимым посвящается
YouTube Video
...
Рейтинг: 0 / 0
Логирование
    #38474962
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
авторА МС славится тем, что общепринятые наработки включает в свои фреймворки как готовые решения.
всем решарпозависимым посвящается
YouTube Video
...
Рейтинг: 0 / 0
Логирование
    #38474982
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
авторСкорее так
Ну и где там романтически контекст зависимости с ганджубасом, вином и тифани.
Скорее быдлячий передоз с солями не более, с внезапными испражнениями на одежду
...
Рейтинг: 0 / 0
Логирование
    #38474999
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Ну а как вам вообще идея ловить ошибки через логирование эксепшенов?
...
Рейтинг: 0 / 0
Логирование
    #38475003
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
да ни как, нравится ловите, мне off хватает, может на суперсложных проектах и востребовано или в каких срм где можно свои модули подключать ( типа моджекпортал), но такие не приходилось делать.
логер для орм то же включен в режиме отладки только, ну в целях офп ( общефизического развития) Вам рекомендую, аз вы его нигде до селе не применяли..
...
Рейтинг: 0 / 0
Логирование
    #38475007
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,авторгде бы было и что за юзер, какой метод какого контроллера вызвал и с какими параметрами
ну а это уже первые звоночки паронои, потом вы создадите маленький освенцым и будете банить за каждый непральный
шаг, потом будете собирать статистику по каждому пользователю плавно переходящую в совокупные личные данные, полученные
рассыльными листами - опросниками, а потом..... потом ваш сайт взломают и вывесят на главной кучу г.... (((( ( меланхолично так)
...
Рейтинг: 0 / 0
Логирование
    #38475121
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,авторгде бы было и что за юзер, какой метод какого контроллера вызвал и с какими параметрами
ну а это уже первые звоночки паронои, потом вы создадите маленький освенцым и будете банить за каждый непральный
шаг, потом будете собирать статистику по каждому пользователю плавно переходящую в совокупные личные данные, полученные
рассыльными листами - опросниками, а потом..... потом ваш сайт взломают и вывесят на главной кучу г.... (((( ( меланхолично так)
Смешно. Я что хочу, то и собираю НА СВОЁМ сервере. А дальше уже проблемы юзеров, чего они мне будут давать. "Что за юзер" - я имел ввиду как минимум его айдишник в моей БД. Вообще, по-моему, стандартная ситуацию, когда надо отследить ошибку - юзер, контроллер, метод, параметры, подробная инфа об эксепшене. А юзеру - заглушку "всё хорошо, а будет ещё лучше".

Где-то в степиuser7320,
да ни как, нравится ловите, мне off хватает
Что такое "off"?
...
Рейтинг: 0 / 0
Логирование
    #38495827
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
авторОпаньки!.. Но мы уже работаем над этим.
ОООоооо, вам солнцеликий угол заказал..

Код: c#
1.
2.
3.
4.
5.
   protected void Application_Error() {
   Exception lastException = Server.GetLastError();
   NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
   logger.Fatal(lastException);
}


NLog через nuget оформить
У меня возник ряд вопросов.

Я подключил NLog - всё работает. Но. Вот тут советуют логировать исключения, отлавливая их именно в том месте, где произошло исключение. А можно сделать так, чтобы все исключения можно было отлавливать в одном месте? Более того, в этом месте я хочу, чтобы была доступна информация о текущем пользователе (короче, HttpContext для текущего запроса), запрошенном конроллере, методе и его параметрах. Чтобы это всё я мог записать в лог. Как это сделать?

И ещё. Я поставил точку останова в методе Application_Error. Оказывается, сначала генерируются исключения в коде контроллеров, и только последним делом выполнение доходит до метода Application_Error. Т. е. в этом методе я хоть и могу отлавливать все исключения, но надо как-то обрабатывать и исключения в коде контроллеров - т. е. опять по месту возникновения исключений чего-то писать. Ну и оказывается, что HttpContext не доступен в методе Application_Error. Так что похоже, что этот метод не лучшее место для отлавливания всех исключений сайта.

Так где же лучшее место для отлавливания всех исключений сайта и как это лучше организовать?
...
Рейтинг: 0 / 0
Логирование
    #38495882
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не претендую на правильность высказанной мысли. Просто возможно этот кусок кода наведет вас на правильные мысли:

Наследник ActionFilterAttribute
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
    /// <summary>
    /// Атрибут для логирования действий контроллеров
    /// </summary>
    public class LogAttribute: ActionFilterAttribute
    {
        public LogLevel Level { get; set; }
        public String Name { get; set; }

        public LogAttribute()
        {
            Level = LogLevel.All;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (String.IsNullOrEmpty(Name))
                Name = String.Format("{0}.{1}", filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName, filterContext.ActionDescriptor.ActionName);

            var logger = LogManager.GetLogger(Name);

            if (logger is NoOpLogger)
                throw new KeyNotFoundException(String.Format("Не найден логгер для указанного источника '{0}'", Name));

            Action<FormatMessageHandler> action = handler => handler(
                "Пользователь: {0}, Источник: {1}, Метод: {2}, Аргументы: {3}", 
                filterContext.RequestContext.HttpContext.User.Identity.Name,
                filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName,
                filterContext.ActionDescriptor.ActionName,
                String.Join(", ", filterContext.ActionParameters.Select(kv => String.Format("{0}='{1}'", kv.Key, kv.Value))));

            switch (Level)
            {
                case LogLevel.All:
                case LogLevel.Trace:
                    logger.Trace(action);
                    break;
                case LogLevel.Debug:
                    logger.Debug(action);
                    break;
                case LogLevel.Info:
                    logger.Info(action);
                    break;
                case LogLevel.Warn:
                    logger.Warn(action);
                    break;
                case LogLevel.Error:
                    logger.Error(action);
                    break;
                case LogLevel.Fatal:
                    logger.Fatal(action);
                    break;
                case LogLevel.Off:
                    break;
                default:
                    throw new ArgumentOutOfRangeException("Неизвестный науке зверь...");
            }

            base.OnActionExecuting(filterContext);
        }
    }

...
Рейтинг: 0 / 0
Логирование
    #38496926
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я с этим NLog чего-то не понял с уровнями логирования . Какой уровень ни выбираю в Logger, всё одно выводит - то, что я ему в качестве параметра дал. Получается, что это Я САМ определяю, какая инфа на каком уровне логирования выводиться будет. А я думал, он сам собирает мне инфу, соответствующую уровню логирования, который я вызвал. Получается, что если не заморачиваться с уровнями, а надо просто вывести какую-нибудь информацию о том же исключении, то можно функцию логирования вызвать любую (Logger.Info там или Logger.Trace)? Так?
...
Рейтинг: 0 / 0
Логирование
    #38496930
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

Да. Именно так. Когда вы пишете Log.Info() - то сообщение будет выведено в лог, если в конфиге для указанного логгера стоит уровень Info и выше.
...
Рейтинг: 0 / 0
Логирование
    #38498269
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Не претендую на правильность высказанной мысли. Просто возможно этот кусок кода наведет вас на правильные мысли:

Наследник ActionFilterAttribute
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
    /// <summary>
    /// Атрибут для логирования действий контроллеров
    /// </summary>
    public class LogAttribute: ActionFilterAttribute
    {
        public LogLevel Level { get; set; }
        public String Name { get; set; }

        public LogAttribute()
        {
            Level = LogLevel.All;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (String.IsNullOrEmpty(Name))
                Name = String.Format("{0}.{1}", filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName, filterContext.ActionDescriptor.ActionName);

            var logger = LogManager.GetLogger(Name);

            if (logger is NoOpLogger)
                throw new KeyNotFoundException(String.Format("Не найден логгер для указанного источника '{0}'", Name));

            Action<FormatMessageHandler> action = handler => handler(
                "Пользователь: {0}, Источник: {1}, Метод: {2}, Аргументы: {3}", 
                filterContext.RequestContext.HttpContext.User.Identity.Name,
                filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName,
                filterContext.ActionDescriptor.ActionName,
                String.Join(", ", filterContext.ActionParameters.Select(kv => String.Format("{0}='{1}'", kv.Key, kv.Value))));

            switch (Level)
            {
                case LogLevel.All:
                case LogLevel.Trace:
                    logger.Trace(action);
                    break;
                case LogLevel.Debug:
                    logger.Debug(action);
                    break;
                case LogLevel.Info:
                    logger.Info(action);
                    break;
                case LogLevel.Warn:
                    logger.Warn(action);
                    break;
                case LogLevel.Error:
                    logger.Error(action);
                    break;
                case LogLevel.Fatal:
                    logger.Fatal(action);
                    break;
                case LogLevel.Off:
                    break;
                default:
                    throw new ArgumentOutOfRangeException("Неизвестный науке зверь...");
            }

            base.OnActionExecuting(filterContext);
        }
    }


Спасибо за подсказку. Но я так понимаю, что надо будет к каждому контроллеру по такому атрибуту приписывать? Хотя, наверное, можно ограничиться каким-нибудь базовым контроллером.

А что вы думаете, если в базовом контроллере переписать метод OnException и поместить весь ваш код (или его аналог - короче, код вытаскивания нужной информации и её логирования) туда? Вроде, OnException как раз для этого подходит?
...
Рейтинг: 0 / 0
Логирование
    #38498288
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё. Я вот уже несколько раз встречал, что люди как-то не хотят обрабатывать ошибки через атрибуты контроллеров или секцию customErrors в веб.конфиге. Почему? Один даже пишет : "was running into all kinds of problems". Почему-то именно в Application_Error в Global.asax.cs пытаются обрабатывать ошибки.

Пока нашёл довольно подробные советы , как и что делать. Хотя, кто-то там в комментах не согласен и тоже неплохую ссылку приводит.
...
Рейтинг: 0 / 0
Логирование
    #38498517
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не спец в ASP.NET, поэтому повторюсь, не стоит мои слова воспринимать как экспертное мнение

Тем не менее, у контроллеров есть метод OnException, через который можно получить доступ к ExceptionContext. Почему бы не определить свой контроллер с переопределенным этим методом, а все свои контроллеры наследовать от него?

PS Если сделаете, как хотите, не забудьте код выложить, я бы тоже посмотрел...
...
Рейтинг: 0 / 0
Логирование
    #38498858
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320И ещё. Я вот уже несколько раз встречал, что люди как-то не хотят обрабатывать ошибки через атрибуты контроллеров или секцию customErrors в веб.конфиге. Почему? Один даже пишет : "was running into all kinds of problems". Почему-то именно в Application_Error в Global.asax.cs пытаются обрабатывать ошибки.

Пока нашёл довольно подробные советы , как и что делать. Хотя, кто-то там в комментах не согласен и тоже неплохую ссылку приводит.
Перечитал всё. Как я понял, что кастомный атрибут, что OnException - всё одно и то же. И работают оба этих варианта в контексте контроллеров и действий. Т. е. ошибки уровня приложения (если я правильно выражаюсь) не отслеживают. Самое лучшее - это и атрибуты (или OnException) для специфических ошибок, и Application_Error - для всего остального. Но это для моего простого сайта это будет логики на четверть моего приложения. Поэтому для быстроты и простоты ограничусь тем, что всё запихну в Application_Error. Тем более, что и оттуда можно легко получить доступ к контексту текущего запроса через this.Context, или HttpContext.Current, или даже ещё варианты есть.

Вместо навороченной логики по вытаскиванию имён контроллеров и действий, решил воспользоваться простым Context.Request.Url.AbsoluteUri - сразу всё видно в одной строке, да ещё и параметры запроса видны. Правда, наверное, если это писать в БД или с помощью специальных просмотрщиков логов обрабатывать, то фильтрации по контроллерам-действиям и прочему не будет. Вобщем, подумаю над этим.
...
Рейтинг: 0 / 0
Логирование
    #38498867
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Context.Request.Url.AbsoluteUri - сразу всё видно в одной строке, да ещё и параметры запроса видны

Да? и параметры, передаваемые через POST?
...
Рейтинг: 0 / 0
Логирование
    #38498868
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПеречитал всё. Как я понял, что кастомный атрибут, что OnException - всё одно и то же.
Между ними отличия ровно в том же, в чём отличия между атрибутом контроллера и просто кодом в контроллере.
...
Рейтинг: 0 / 0
Логирование
    #38498892
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79user7320Context.Request.Url.AbsoluteUri - сразу всё видно в одной строке, да ещё и параметры запроса видны

Да? и параметры, передаваемые через POST?
Не пробовал. Я не умею имитировать POST-запрос. А так у меня все "посты" имеют в параметрах модель - там всякие привязки-развязки работают. При этом ненавязчивая валидация на клиенте через javascript... Как сымитировать POST с ошибкой в моём случае, чтобы вызвать исключение? Тогда я проверю, будут там параметры в AbsoluteUri или нет.

Вы там про то, что у меня получится, просили написать. Да я в этом мало разбираюсь, поэтому по-простому просто в Application_Error всё запульну и буду логировать, а юзеру выдавать заглушку "Опаньки..." или что-то в этом роде. А код буду использовать вот что по ссылкам и у вас - он одинаковый. Единственное, что от себя добавлю - это NLog настрою так, как я хотел - т. е. имя юзера, полный адрес с параметрами запроса (таким способом или другим) и трассировку стека вызова функций. Пожалуй, хватит. По мере пользования буду, наверное, добавлять всякие фильтры, чтобы не логировались всякие дурацкие вещи, типа юзер неправильно имя контроллера-действия в адресной строке набрал или не тот айдишник вбил. Это для любителей руками адреса вводить - им-то, может, и всё равно, а у меня логи мусором забиваться будут. Вобщем, сразу так я это логирование не построю - надо опыта поднабраться и по мере пользования настраивать.
...
Рейтинг: 0 / 0
Логирование
    #38498906
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕдинственное, что от себя добавлю - это NLog настрою так, как я хотел - т. е. имя юзера, полный адрес с параметрами запроса (таким способом или другим) и трассировку стека вызова функций.
Ещё только вот это добавлю. ))
...
Рейтинг: 0 / 0
Логирование
    #38498910
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320авторЕдинственное, что от себя добавлю - это NLog настрою так, как я хотел - т. е. имя юзера, полный адрес с параметрами запроса (таким способом или другим) и трассировку стека вызова функций.
Ещё только вот это добавлю. ))
В смысле, что проход по всем вложенным исключениям и их логирование.
...
Рейтинг: 0 / 0
Логирование
    #38499903
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79user7320Context.Request.Url.AbsoluteUri - сразу всё видно в одной строке, да ещё и параметры запроса видны

Да? и параметры, передаваемые через POST?
Так. Кинул исключение ручками на POST-запросе и посмотрел, что залогировалось.

Сразу скажу, что ваша строка

Код: c#
1.
String.Join(", ", filterContext.ActionParameters.Select(kv => String.Format("{0}='{1}'", kv.Key, kv.Value))));



для меня оказалась непонятна в том смысле, что я не понял, как в Application_Error получить объект ActionExecutingContext (у вас такого типа - параметр filterContext), чтобы вытащить параметры запроса. Но я нашёл другой способ - Request.Unvalidated.Form. Вот так можно получить все параметры формы, включая скрытые, включая всякие __RequestVerificationToken:

Код: c#
1.
2.
3.
4.
this.Context.Request.Unvalidated.Form
    .Cast<string>()
    .Select(key => new KeyValuePair<string, string>(key, ctx.Request.Unvalidated.Form[key]))
    .Select(pp => String.Format("{0}='{1}'", pp.Key, pp.Value))



Приведение Form типа NameValueCollection взял отсюда - http://stackoverflow.com/a/396504/808128 .

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

Если вы знаете, как получить ActionExecutingContext в Application_Error, то буду благодарен - чтобы не маяться с приведением формы и её разложением.
...
Рейтинг: 0 / 0
Логирование
    #38499910
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее, полностью код выглядит так:

Код: c#
1.
2.
3.
4.
5.
6.
String.Join(
    "\n", 
    this.Context.Request.Unvalidated.Form
        .Cast<string>()
        .Select(key => new KeyValuePair<string, string>(key, ctx.Request.Unvalidated.Form[key]))
        .Select(pp => String.Format("{0}='{1}'", pp.Key, pp.Value)))
...
Рейтинг: 0 / 0
Логирование
    #38499918
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что интересно, перепробовал все поля и подполя в this.Context - нигде не нашёл параметров запроса, кроме как в форме. Даже this.Context.Request.RequestContext.RouteData содержит только имена контроллера и действия.
...
Рейтинг: 0 / 0
Логирование
    #38499925
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320что я не понял, как в Application_Error получить объект ActionExecutingContext
Ну так он для действий же. Изначально у меня не стояла задача ловить только ошибки. Нужно было логировать обращения к методам, и все.

user7320чтобы не маяться с приведением формы и её разложением.
Кажется, раскладкой параметров в модель занимается DefaultModelBinder. Или его наследники (созданные вами).
...
Рейтинг: 0 / 0
Логирование
    #38499942
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79user7320что я не понял, как в Application_Error получить объект ActionExecutingContext
Ну так он для действий же. Изначально у меня не стояла задача ловить только ошибки. Нужно было логировать обращения к методам, и все.

user7320чтобы не маяться с приведением формы и её разложением.
Кажется, раскладкой параметров в модель занимается DefaultModelBinder. Или его наследники (созданные вами).
Про раскладку формы я имел ввиду мой код - вот эта портянка может быть как-нибудь сокращена? Или вы тоже пока не знаете, как попроще получить параметры POST-запроса?
...
Рейтинг: 0 / 0
Логирование
    #38499946
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Arm79пропущено...

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

пропущено...

Кажется, раскладкой параметров в модель занимается DefaultModelBinder. Или его наследники (созданные вами).
Про раскладку формы я имел ввиду мой код - вот эта портянка может быть как-нибудь сокращена? Или вы тоже пока не знаете, как попроще получить параметры POST-запроса?

Именно в Application_Error, я имею ввиду, а не в контроллерах или действиях.
...
Рейтинг: 0 / 0
Логирование
    #38499958
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

На память не помню, но вроде параметры формы можно получить из свойства Request.Form
...
Рейтинг: 0 / 0
Логирование
    #38500071
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79user7320,

На память не помню, но вроде параметры формы можно получить из свойства Request.Form
Ну, это то же, что и у меня, только до валидации. По идее, надо как раз брать Request.Unvalidated.Form, чем Request.Form, чтобы можно было воспроизвести исключение, т. к. это то, что юзер непосредственно ввёл.
...
Рейтинг: 0 / 0
Логирование
    #38500338
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем, намалевал вот что пока:

в NLog таргет вот такой простой

Код: xml
1.
2.
3.
4.
5.
6.
<target
	name="logFile"
	xsi:type="File"
	fileName=".../siteLog.txt"
	layout="${longdate} ${newline} ${message} ${newline} ${newline}" >
</target>



В Global.asax портянка

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
protected void Application_Error()
{
    HttpContext ctx = this.Context;
    Exception lastException = Server.GetLastError();

    StringBuilder sb = new StringBuilder();

    sb.AppendLine("_User:");
    sb.AppendLine(ctx.User.Identity.Name);
    sb.AppendLine("_Absolute URI:");
    sb.AppendLine(ctx.Request.Url.AbsoluteUri);
    sb.AppendLine("_POST request unvalidated form fields:");
    sb.AppendLine(
        String.Join(
            "\n",
            ctx.Request.Unvalidated.Form
                .Cast<string>()
                .Select(key => new KeyValuePair<string, string>(key, ctx.Request.Unvalidated.Form[key]))
                .Select(pp => String.Format("{0}='{1}'", pp.Key, pp.Value))));
    sb.AppendLine("_Route data values:");
    sb.AppendLine(
        String.Join(
            "\n",
            ctx.Request.RequestContext.RouteData.Values
                .Select(p => String.Format("{0}='{1}'", p.Key, p.Value))));
    sb.AppendLine("_Stack trace:");
    sb.AppendLine(lastException.StackTrace);
    sb.AppendLine("_Exceptions info:");
    do
    {
        sb.AppendLine(lastException.Message);
        lastException = lastException.InnerException;
    }
    while (lastException != null);

    MvcApplication.Logger.Trace(sb.ToString());
}



Проверил на GET- и POST-запросах - работает. Если нет параметров формы (GET-запрос, например) - то просто пустое место.
...
Рейтинг: 0 / 0
Логирование
    #38500342
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот только думаю, что проблемы с просмотрщиками могут быть. Вроде, чтобы они там удобно показывали, надо все вот эти мои заголовки, типа "_Stack trace" и т. п. в настройки layout для NLog поместить. Вобщем, посмотрю. Главное, я получил, чего хотел.
...
Рейтинг: 0 / 0
Логирование
    #38500344
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, вот ещё забыл показать юзеру нормальную заглушку, а не трассировку стека вываливать.
...
Рейтинг: 0 / 0
Логирование
    #38501141
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если интересует только логирование ошибок asp.net, то я бы рекомендовал elmah
...
Рейтинг: 0 / 0
Логирование
    #38501278
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЕсли интересует только логирование ошибок asp.net, то я бы рекомендовал elmah
Мне нужно все исключения логировать. Пока. Потом я будут фильтровать, какие логировать не стоит. Но, как я понял, штука в том, что на самом деле достаточно самого простого логировщика - буквально, который будет тупо аппендить тестовый файл или в БД записывать. Я имею ввиду, что сами исключения и всю необходимую инфу я собираю сам и превращаю её либо в объект, либо в строку. А от логировщика уже нужно только уметь обращаться с этим объектом или строкой - очень простое требование, правда?

Я вот тот же NLog глянул - там логирование, например, в текстовый файл не содержит в себе никакой магии - String.Append на каждом шагу, а потом просто добавляет в файл и всё. Такое и я сам мог бы написать. Единственный плюс - в предустановленных шаблонах записи (типа дат, исключений конкретного типа, назначений записей логов (файл, БД и пр.) и т. п.), которые можно настраивать в файле конфигурации - т. е. без перекомпиляции всего проекта. Т. е. сам бы я такое долго писал, а тут всё готовое. В то же время никакого ноу-хау тут нет - просто освободжают от рутины.

Короче, для меня сейчас все эти логировщики на одно лицо - умеют писать в файл или БД и всё - мне этого за глаза хватит пока.
...
Рейтинг: 0 / 0
Логирование
    #38501957
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел примеры работы с Application_Error. Не понял, почему у всех завидное пристрастие к использованию Response.Clear() и Server.ClearError()? Вот примеры:

http://stackoverflow.com/a/1171805/808128
http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc#returningviews


Некоторые даже целую портянку пишут:

Код: c#
1.
2.
3.
4.
httpContext.ClearError();
httpContext.Response.Clear();
httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500;
httpContext.Response.TrySkipIisCustomErrors = true;



Посмотрел в МСДН :
авторThe following example sets the ContentType property for the response to image/jpeg, calls the Clear method to remove other content that might be attached to the response, and then sets the BufferOutput property to true so that the complete page will be processed before any content is sent to the requesting client.
Т. е. я так понимаю, что если к ответу сервера уже что-то было приложено, какой-то контент, и ошибка возникла после того, как к ответу что-то было приложено, то если стоит задача только сообщить юзеру об ошибке, то нет смысла отправлять ему этот контент? Я правильно понимаю?

Теперь по Server.ClearError(). Посмотрел в МСДН и тоже не очень понял. Единственное, как я понял, на что оно может сгодиться - очистить логи сервера от логирования обработанных исключений. Т. е. раз мы его обработали, то и логировать его вроде как не нужно?
...
Рейтинг: 0 / 0
Логирование
    #38502114
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Логирование
    #38502164
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320 Вот те на!
Решил . ))

Но другая напасть. В лог с таким решением, как у меня, пишется информации об исключениях на языке, соответствующему текущей культуре. А как сделать так, чтобы всегда писалось на английском?
...
Рейтинг: 0 / 0
Логирование
    #38504113
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж, топик мягко и ненавязчиво перерос в запись блога user7320

Практической пользы, IMHO, для человека имеющего искать и находить решения, почти ноль...

User7320, серебряной пули (это то чего Вы собираетесь делать) не бывает. Не изобретайте лисапедов...
Ошибки нужно перехватывать и обрабатывать в месте их возникновения. А то может статься так, что в результате вот такого "логирования" может быть потеряна важная информация для пользования, или же к примеру запись информации в базу произойдёт, а ошибка будет в момент генерирования ответа, а у Вас в данном случае ничего кроме "оппаньки" (__о__) пользователю показано не будет...
...
Рейтинг: 0 / 0
Логирование
    #38504115
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

И прежде чем браться за логирование GET, POST, HEAD и т.д. хорошо бы прочитать спецификацию протокола HTTP...
А то собрались логировать GET и POST, а когда они используются и чем отличаются понятия не имеете (это судя по удивлённым постам в этой теме о том, что запрос POST гененируется только формами)...
...
Рейтинг: 0 / 0
Логирование
    #38504282
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,

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

Скажите, как вы себе представляете "перехватывать и обрабатывать в месте их возникновения"? Берём любую функцию .NET - каждая может кидать от одного до полудесятка разных исключений. Я так понимаю, что "идеальный код" выглядит так: пять строк бизнес-логики и сто строк обработки исключений вызванных функций, логирования и прочей "обслуги". На это ещё сверху юнит-тестов отсыпать, которые, как известно, по объёму раза в 2 больше кода, который они тестируют. Написали пять строк "по правилам"? Оттестировали? Потратили полдня на всё это? - Можно дальше писать...

Понятно, что так никто не пишет. Перехватывают только самые основные исключения. Только штука в том, что я недостаточно опытен, чтобы знать, в каком случае какие будут основные. Плюс у меня нет времени сейчас внести сразу в весь проект обработку исключений по месту - в контроллеры и прочее - т. к. поначалу проект писался почти без обработки исключений. Поэтому я считаю, что нужно как-то реализовать глобальный перехват всех исключений, по крайней мере, на первое время.
...
Рейтинг: 0 / 0
Логирование
    #38504954
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

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

user7320...Берём любую функцию .NET - каждая может кидать от одного до полудесятка разных исключений. Я так понимаю, что "идеальный код" выглядит так: пять строк бизнес-логики и сто строк обработки исключений вызванных функций, логирования и прочей "обслуги"... Ну, утрировать-то не нужно. Не всякая функция может до полудесятка исключений "кидать", а лишь действительно критические. Есть одно правило - не доводить дело до исключений. Как? Проверками... (повторяюсь... плохо это...).

Кроме того, Ваше утверждение: user7320...Только штука в том, что я недостаточно опытен, чтобы знать, в каком случае какие будут основные...не должно служить оправданием использованию недостаточно грамотного подхода. Потратьте время на изучение поведения критических мест в различных ситуациях и поймёте где, какие исключения и как перехватывать. Соответственно появится опыт... Ну и понимание...

В общем - удачи...
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Логирование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]