Який найкращий спосіб керувати реєстрацією помилок за винятками?


13

Вступ

Якщо на веб-сайті або в системі з’являється помилка, звичайно, корисно її зареєструвати та показати користувачеві ввічливе повідомлення з посилальним кодом на помилку.

І якщо у вас багато систем, ви не хочете, щоб ця інформація була пунктированою навколо - добре мати єдине централізоване місце для неї.

На найпростішому рівні, все, що потрібно, - це приріст ідентифікатора та серіалізований дамп даних про помилку. (І, можливо, "централізоване місце" - це поштова скринька.)

На іншому кінці спектра - це, можливо, повністю нормалізована база даних, яка також дозволяє натиснути кнопку і побачити графік помилок на день, або визначити, що найпоширеніший тип помилок у системі X, чи є у сервера А більше бази даних помилки підключення, ніж сервер B тощо.

Я маю на увазі тут реєстрацію помилок / винятків на рівні коду за допомогою віддаленої системи, а не відстеження проблем на основі "людини", таких як Jira, Trac тощо.


Запитання

Я шукаю думки розробників, які використовували цей тип системи, зокрема стосовно:

  • Які найважливіші риси, без яких ви не могли б обійтися?
  • Які корисні функції, які дійсно заощаджують ваш час?
  • Які функції можуть здатися гарною ідеєю, але насправді вони не такі корисні?

Наприклад, я б сказав, що функція "показати дублікати", яка визначає багаторазове виникнення помилки (не турбуючись про "неважливі" деталі, які можуть відрізнятися) є досить важливою.
Кнопка "створити проблему в [Jira / тощо] для цієї помилки" звучить як непогана економія часу.

Просто для повторного повторення - те, що я шукаю - це практичний досвід людей, які користувалися такими системами, бажано підкріпленими тим, чому функція є приголомшливою / жахливою.
(Якщо ви все-таки збираєтеся теоретизувати, як мінімум, позначте свою відповідь такою.)


2
Варто пам’ятати одне: якщо ви щось записуєте, щось пішло не так, і може бути не одне. Тримайте дії з ведення журналу на простому боці.
Девід Торнлі

ведення журналу на рівні налагодження чи інформації не обов'язково означає, що щось не так. Він може, наприклад, містити інформацію, необхідну для проведення смертного аналізу.

Я бачив реєстратори винятків, які самі викидають виняток на String.Format (C #) :). Зберігайте вхід простим, бажано безризиковим, НЕ динамічним (наприклад, не розбирайте XML-файл, коли ви намагаєтесь записати виняток). Уникайте динамізму в реєстрації помилок, якщо можете. Якщо у вас є файл, налаштований у XML-файлі, я думаю, що краще сформувати якийсь фактичний код на його основі (твердий), а не розбирати цей конфігураційний файл під час виконання, поки ви знаходитесь в середині повідомлення про помилку (динамічний ). Це все одно був мій досвід. Можливо, ви хочете мати план B для ведення журналу - якщо фантазійне виведення не вдається, журнал простий
робота

Відповіді:


5

Я брав участь у проекті, де зафіксовано помилки клієнта за допомогою бібліотеки Microsoft Enterprise . Усі винятки, де надсилаємо на нашу поштову скриньку. У тему пошти ми додали хеш-код серіалізованої помилки для уникнення дублювання повідомлень. Звичайно, можна зберігати серіалізовані повідомлення в базі даних тощо.

Рекомендую переглянути бібліотеку Microsoft Enterprise та Log4Net .

Деякі особливості Log4Net

  • Підтримка декількох фреймворків
  • Виведення на кілька цілей реєстрації
  • Ієрархічна архітектура журналів
  • Конфігурація XML
  • Динамічна конфігурація
  • Контекст журналу
  • Перевірена архітектура
  • Модульна та розтяжна конструкція • Висока продуктивність та гнучкість

1
хороший реєстратор дозволить вам підштовхнути ваші помилки до збереження вашого вибору (електронна пошта, БД, файл тощо).
Кен Хендерсон

1

Що стосується програм для баз даних, якийсь ідентифікатор (подібний <TABLE>:<PrimaryKeyID>), який дозволяє відслідковувати записи в базі даних, пов'язані з областю, де було вилучено виняток.

Я робив це за допомогою Oracle і PL / SQL, записуючи ідентифікатор у таблицю бази даних в рамках програми, від обробника винятків.


Безумовно, добре записати хоча б таблицю та записи, які обробляються. Ще краще, звичайно, мати спробу оператора SQL (та будь-які параметри).
Пітер Бауфтон

1

Значна частина того, що ви описуєте (тобто конкретні частини ведення журналу), реалізовано в бібліотеці підприємств, як зазначив Амір Резай. Все інше, здається, є більшою частиною аналітики (тобто що робити з журналами згодом).

У моєму випадку я створив невеликі програми та сценарії sql, які полегшили деякі речі. Ось деякі речі, які мені дуже сподобалися:

  • Згрупування однакових помилок разом (тобто 100 користувачів усі відчували одну і ту ж помилку за один і той же час - 1 звіт про помилку із зазначенням кількості випадків)
  • Автоматична подача квитка у трекер справи (ніколи не вдавалося зробити це "одним натисканням кнопки", але завжди хотіла)
  • Ім'я користувача користувача програмного забезпечення (не лише машини, яка доступна у більшості реєстраторів). У деяких випадках автоматизовані облікові записи користувачів викликали проблеми, тоді як в інших конкретні користувачі були причиною проблем. "Мені потрібно спостерігати, як Майк виконує якусь роботу, він продовжує викликати конкретну помилку".
  • "Дії користувача" - у мене був глобальний стек, який би відслідковував кожне дійсне натискання / натискання кнопки, як це робив користувач, і це було застосовано до журналів помилок. Повторення помилки часто було випадком проходження цього сліду та виконання тих же кроків, що і користувач (я сподівався створити тестовий генератор CodedUI, який би проаналізував трасування і виконав кроки автоматично, але ніколи не робив)

0

Іноді інформація журналу є занадто об'ємною, щоб зберігати її на диску. Я бачив один із підходів - написати свої записи в реєстрації до firehose (у, скажімо, perl) щось подібне:

# Create socket.
my $sock = IO::Socket::INET->new(
    Proto       => 'udp',
    PeerAddr    => $bcastaddr,
    Broadcast   => 1,
) or die "Can't create socket ($bcastaddr): $!";

while (<>) {
    chomp;
    unless (/File\ does\ not\ exist:/) {
        $sock->send("$eventtype:$_") or warn "Can't send: $!";
    }
}

тоді аналітик може схопитися на те, що він / хто хоче подивитися.


3
Не впевнені, що таке "firehose"? Враховуючи ємність дисків сьогодні, я сподіваюся, помилки були не настільки поширеними, що розмір журналу буде проблемою.
Пітер Бауфтон

0

Ось які речі я дізнався з моніторингу помилок у наших програмах:

  • Можливість підключення файлу журналу, що перекочується (я зазвичай використовую log4net / log4j для входу в додатки, а BareTail - для того, щоб слідкувати за журналом) - це дуже корисно для того, щоб можна було перевірити поточний стан системи
  • Щоб побачити, коли були введені проблеми та швидкість, з якою виникають проблеми, непогано мати їх у базі даних із часовими позначками, до яких можна запускати звіти.
  • Можливість надсилати електронну пошту / sms / голосові сповіщення дуже корисна для забезпечення того, щоб системи залишалися в режимі роботи, але ви повинні мати можливість легко налаштувати типи помилок, які вас попереджають. Якщо ви отримуєте 800 електронних листів із помилками в день, ви обов'язково пропустите "О, центр обробки даних не працює".

Я мав чудові результати для log4net, тому що він дуже просто реєструється в декількох місцях і легко змінює конфігурацію журналу.


0

elmah - це система реєстрації помилок з відкритим кодом для додатків ASP.NET, яку можна швидко та легко додавати до існуючої системи (за допомогою NuGet http://nuget.codeplex.com/ ). Він підтримує різні перешкоди та функції оповіщення.

Я не знаю нікого, хто додав його до настільного додатку, оскільки він працює як веб-сайт, але нічого не заважає вам запустити його як службу та розмістити свої винятки з неї через Інтернет.

http://code.google.com/p/elmah/

ELMAH (Модулі та оброблячі помилок) - це програма, що веде повне підключення до журналу помилок. Його можна динамічно додавати до запущеного веб-додатку ASP.NET або навіть до всіх веб-додатків ASP.NET на машині, без необхідності повторної компіляції чи повторного розгортання.

Після того, як ELMAH буде скинуто на запущений веб-додаток і налаштовано належним чином, ви отримаєте такі засоби, не змінюючи жодного рядка свого коду:

  • Реєстрація майже всіх необроблених винятків.
  • Веб-сторінка для віддаленого перегляду всього журналу перероблених винятків.
  • Веб-сторінка для віддаленого перегляду повних відомостей про будь-який зареєстрований виняток, включаючи кольорові сліди стека.
  • У багатьох випадках ви можете переглянути оригінальний жовтий екран смерті, який ASP.NET генерував за певний виняток, навіть при customErrorsвимкненому режимі.
  • Повідомлення електронною поштою про кожну помилку в момент її виникнення.
  • RSS-канал з останніх 15 помилок з журналу ...

ELMAH ненадійний. Якщо httpcontext буває NULL ==> бум
четвер

@Quandary Цікаво, чи я щось пропускаю? Ми бачимо помилку при спробі увійти до програми ELMAH з програми, і HttpContext є нульовим, але якщо у вас є доступ до кореневого рівня -> створіть новий логгер elmah з нульовим контекстом та журналом, тоді він працює добре. Чи є місця на звичайному веб-сайті ASP.NET, які він може спробувати ввійти, і HttpContext є нульовим?
Ян Грінґер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.