Оновлення: Про розширення до System.Diagnostics, що надають деякі з пропущених слухачів, які вам можуть захотіти, див. Essential.Diagnostics на CodePlex ( http://essentialdiagnostics.codeplex.com/ )
Каркаси
З: Які рамки ви використовуєте?
A: System.Diagnostics.TraceSource, вбудований в .NET 2.0.
Він забезпечує потужний, гнучкий, високоефективний журнал для додатків, проте багато розробників не знають про його можливості та не використовують їх у повній мірі.
Є деякі області, в яких додаткова функціональність корисна, а іноді функціональність існує, але вона не є добре задокументована, однак це не означає, що всю рамку ведення журналу (яка призначена для розширення) слід викинути і повністю замінити, як деякі популярні альтернативи (NLog, log4net, Common.Logging і навіть EntLib Logging).
Замість того, щоб змінити спосіб додавання заяв реєстрації до програми та повторного винайдення колеса, ви просто розширили систему System.Diagnostics на декілька потрібних вам місць.
Мені здається, що інші рамки, навіть EntLib, просто страждають від синдрому Not Invented Here, і я думаю, що вони витратили час на переосмислення основ, які вже добре працюють в System.Diagnostics (наприклад, як ви пишете журнальні заяви), а не заповнення кількох існуючих прогалин. Словом, не використовуйте їх - вони не потрібні.
Особливості, які ви, можливо, не знали:
- Використання перевантажень TraceEvent, які приймають рядок формату та аргументи, може сприяти продуктивності, оскільки параметри зберігаються як окремі посилання до досягнення успіху Filter.ShouldTrace (). Це означає, що жодних дорогих викликів ToString () на значення параметрів, поки система не підтвердиться, повідомлення фактично не буде зареєстровано.
- Trace.CorrelationManager дозволяє співвіднести оператори журналу про одну і ту ж логічну операцію (див. Нижче).
- VisualBasic.Logging.FileLogTraceListener хороший для запису в журнал файлів та підтримує обертання файлів. Хоча у просторі імен VisualBasic він може бути так само легко використаний у проекті C # (або іншої мови), просто включивши DLL.
- Якщо ви використовуєте EventLogTraceListener, якщо ви викликаєте TraceEvent з декількома аргументами та з порожнім або нульовим рядком формату, то аргументи передаються безпосередньо в EventLog.WriteEntry (), якщо ви використовуєте локалізовані ресурси повідомлень.
- Засіб Service Trace Viewer (від WCF) корисний для перегляду графіків корельованих файлів журналів активності (навіть якщо ви не використовуєте WCF). Це дійсно може допомогти налагодити складні проблеми, коли задіяно декілька потоків / активів.
- Уникайте накладних витрат, очищаючи всіх слухачів (або видаляючи за замовчуванням); інакше за замовчуванням все передасть у систему слідів (і понесе всі накладні витрати ToString ()).
Сфери, які ви хочете подивитися на розширення (якщо потрібно):
- Слухач слідів бази даних
- Слухач кольорових консольних слідів
- Слухачі трасування MSMQ / Email / WMI (за потреби)
- Встановіть FileSystemWatcher для виклику Trace.Refresh для динамічних змін конфігурації
Інші рекомендації:
Використовуйте структуровані ідентифікатори подій та зберігайте довідковий список (наприклад, документуйте їх у перерахунку).
Наявність унікальних ідентифікаторів подій для кожної (важливої) події у вашій системі дуже корисно для співвіднесення та пошуку конкретних проблем. Легко відстежувати конкретний код, який реєструє / використовує ідентифікатори подій, і це спрощує надання інструкцій щодо поширених помилок, наприклад, помилка 5178 означає, що рядок підключення до бази даних невірний тощо.
Ідентифікатор подій повинен відповідати деякій структурі (подібно до Теорії кодів відповідей, що використовується в електронній пошті та HTTP), яка дозволяє обробляти їх за категоріями, не знаючи конкретних кодів.
наприклад, перша цифра може деталізувати загальний клас: 1xxx можна використовувати для операцій "Пуск", 2xxx для нормальної поведінки, 3xxx для відстеження активності, 4xxx для попереджень, 5xxx для помилок, 8xxx для операцій "Стоп", 9xxx для фатальних помилок, тощо.
Друга цифра може деталізувати область, наприклад, 21xx для інформації про базу даних (41xx для попередження бази даних, 51xx для помилок бази даних), 22xx для режиму обчислення (42xx для попередження обчислення тощо), 23xx для іншого модуля тощо.
Присвоєні структуровані ідентифікатори подій також дозволяють використовувати їх у фільтрах.
Питання: Якщо ви використовуєте калькування, чи використовуєте ви Trace.Correlation.StartLogicalOperation?
A: Trace.CorrelationManager дуже корисний для співвіднесення виписок журналу в будь-якому середовищі з багатопотоковою обстановкою (що в наші дні майже все).
Вам потрібно принаймні встановити ActivityId один раз для кожної логічної операції, щоб співвідносити.
Start / Stop та LogicalOperationStack можуть бути використані для простого контексту на основі стека. Для більш складних контекстів (наприклад, асинхронних операцій) використання TraceTransfer до нового ActivityId (перед його зміною) дозволяє корелювати.
Засіб Service Trace Viewer може бути корисним для перегляду графіків активності (навіть якщо ви не використовуєте WCF).
Питання: Чи пишете ви цей код вручну чи використовуєте певну форму орієнтованого на нього аспекту? Хочете поділитися фрагментом коду?
Відповідь: Ви можете створити клас області, наприклад, LogicalOperationScope, який (a) встановлює контекст під час створення та (b) скидає контекст під час видалення.
Це дозволяє записати такий код, як наведений нижче, для автоматичного завершення операцій:
using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
{
// .. do work here
}
При створенні області може спочатку встановити ActivityId, якщо потрібно, зателефонуйте до StartLogicalOperation та введіть повідомлення TraceEventType.Start. У розпорядженні Dispose може записати повідомлення Stop, а потім викликати StopLogicalOperation.
Питання: Чи надаєте ви будь-яку форму деталізації щодо джерел слідів? Наприклад, WPF TraceSources дозволяють налаштувати їх на різних рівнях.
A: Так, декілька джерел слідів корисні / важливі в міру збільшення системи.
Хоча ви, мабуть, хочете послідовно реєструвати всі попередження та вище, або всю інформацію та інформацію вище, для будь-якої системи розумного розміру обсяг відстеження активності (пуск, зупинка тощо) та багатословного ведення журналів просто стає занадто великим.
Замість того, щоб мати лише один перемикач, який все це вмикає або вимикає, корисно мати можливість увімкнути цю інформацію за один розділ вашої системи одночасно.
Таким чином, ви можете виявити значні проблеми із звичайного ведення журналу (всі попередження, помилки тощо), а потім "збільшити масштаб" на потрібних розділах і встановити їх на рівні відстеження активності або навіть на рівні налагодження.
Кількість потрібних джерел слідів залежить від вашої заявки, наприклад, ви можете хотіти одне джерело слідів на збірку або на основний розділ вашої програми.
Якщо вам потрібен ще більш тонкий налаштований контроль, додайте індивідуальні булові перемикачі, щоб увімкнути / вимкнути специфічне відстеження великої гучності, наприклад, скидання нераціональних повідомлень. (Або може бути використане окреме джерело слідів, подібне до WCF / WPF).
Ви також можете розглянути окремі джерела трасування для відстеження активності проти загального (іншого) ведення журналів, оскільки це може полегшити налаштування фільтрів саме так, як ви їх хочете.
Зауважте, що повідомлення все ще можна співвіднести через ActivityId, навіть якщо використовуються різні джерела, тому використовуйте стільки, скільки потрібно.
Слухачі
З: Які виходи журналу ви використовуєте?
Це може залежати від того, який тип програми ви пишете та які речі реєструються. Зазвичай різні речі йдуть у різних місцях (тобто декілька виходів).
Я, як правило, класифікую результати на три групи:
(1) Події - Журнал подій Windows (та файли трасування)
Наприклад, якщо писати сервер / послугу, то найкращою практикою для Windows є використання журналу подій Windows (у вас немає інтерфейсу, для якого потрібно звітувати).
У цьому випадку всі події "Фатальна помилка", "Помилки", "Попередження" та "Інформація про рівень обслуговування" повинні переходити до Журналу подій Windows. Рівень інформації повинен бути зарезервований для таких типів подій високого рівня, тих, які ви хочете пройти в журналі подій, наприклад, "Служба розпочата", "Сервіс припинено", "Підключено до Xyz", а може бути навіть "Розклад розпочато" , "Користувач увімкнено" тощо.
У деяких випадках ви можете зробити запис у журнал подій вбудованою частиною вашої програми, а не через систему слідів (тобто записувати записи журналу подій безпосередньо). Це означає, що його не можна випадково вимкнути. (Зверніть увагу, ви все ще хочете відзначити ту саму подію у своїй системі слідів, щоб ви могли співвіднестись).
На відміну від цього, програма GUI Windows зазвичай повідомляє про це користувачеві (хоча вони також можуть увійти до Журналу подій Windows).
Події можуть також мати відповідні лічильники ефективності (наприклад, кількість помилок / сек), і може бути важливо координувати будь-яке пряме записування до Журналу подій, лічильники ефективності, запис у систему трасування та звітування перед користувачем, щоб вони відбувалися на одночасно.
тобто якщо користувач бачить повідомлення про помилку в певний час, ви повинні мати можливість знайти те саме повідомлення про помилку в Журналі подій Windows, а потім ту саму подію з тією ж міткою часу в журналі слідів (разом з іншими деталями відстеження).
(2) Діяльність - Файли журналу додатків або таблиця баз даних (та файли трасування)
Це регулярна діяльність, яку здійснює система, наприклад, розміщена веб-сторінка, подана торгівля на фондовому ринку, прийняте замовлення, виконаний розрахунок тощо.
Тут є корисним відстеження активності (старт, зупинка тощо) (у правильній детальності).
Крім того, дуже часто використовується специфічний Журнал додатків (іноді його називають Журналом аудиту). Зазвичай це таблиця бази даних або файл журналу додатків і містить структуровані дані (тобто набір полів).
Тут речі можуть трохи розмитися залежно від вашої програми. Хорошим прикладом може бути веб-сервер, який записує кожен запит у веб-журнал; подібними прикладами може бути система обміну повідомленнями або система обчислення, де кожна операція реєструється разом із деталями, що стосуються додатків.
Не дуже вдалий приклад - торги на фондовому ринку або система замовлення продажів. У цих системах ви, ймовірно, вже реєструєте діяльність, оскільки вони мають важливе значення для бізнесу, однак принцип їх співвідношення з іншими діями все ще важливий.
Як і спеціальні журнали додатків, діяльність також часто має відповідні лічильники ефективності, наприклад, кількість транзакцій в секунду.
Як правило, вам слід координувати ведення журналів діяльності в різних системах, тобто записувати в журнал додатків одночасно, коли ви збільшуєте лічильник ефективності та входите в систему слідів. Якщо ви робите все одночасно (або прямо один за одним у коді), то налагодження проблем простіше (ніж якщо вони всі виникають у різний час / місця в коді).
(3) Trabubu Trace - текстовий файл, а може бути, XML або база даних.
Це інформація на рівні докладної та нижчої (наприклад, спеціальні булеві перемикачі для вмикання / вимикання неочищених скидів даних). Це забезпечує вміст або детальну інформацію про те, що система робить на рівні суб-діяльності.
Це рівень, який ви хочете мати можливість вмикати / вимикати для окремих розділів вашої програми (отже, для кількох джерел). Ви не хочете, щоб цей матеріал захаращувався Журналом подій Windows. Іноді використовується база даних, але швидше за все це прокатні файли журналів, які очищаються через певний час.
Велика різниця між цією інформацією та файлом журналу додатків полягає в тому, що вона неструктурована. У той час як у Журналі додатків можуть бути поля "Для", "Від", "Сума" тощо, сліди налагодження вербальної версії можуть бути будь-якими програмами, наприклад "перевірка значень X = {значення}, Y = помилка" або випадкові коментарі / маркери, наприклад " Зробив це, спробував ще раз ".
Однією з важливих практик є переконання, що речі, які ви вводите у файли журналу додатків або Журнал подій Windows, також потрапляють у систему трасування з тими ж деталями (наприклад, часова мітка). Це дозволяє потім співвіднести різні журнали під час дослідження.
Якщо ви плануєте використовувати певний переглядач журналів, оскільки у вас складна кореляція, наприклад, програма перегляду служб трасування, вам потрібно використовувати відповідний формат, тобто XML. В іншому випадку простий текстовий файл, як правило, досить хороший - на нижчих рівнях інформація значною мірою неструктурована, тому ви можете знайти скиди масивів, звалища стеків тощо. За умови, що ви зможете співпрацювати з більш структурованими журналами на більш високих рівнях, все повинно будь добре.
Питання: Якщо ви використовуєте файли, чи використовуєте ви прокатні журнали чи лише один файл? Як зробити журнали доступними для споживання людьми?
Відповідь: Для файлів, як правило, потрібно прокрутити файли журналів з точки зору керованості (для System.Diagnostics просто використовуйте VisualBasic.Logging.FileLogTraceListener).
Доступність знову залежить від системи. Якщо ви говорите лише про файли, то для сервера / сервісу, до потрібних файлів можна просто отримати доступ, коли це необхідно. (Журнал подій Windows або журнали додатків бази даних матимуть власні механізми доступу).
Якщо у вас немає простого доступу до файлової системи, відстежувати налагодження до бази даних може бути простіше. [тобто реалізувати базу даних TraceListener].
Одне цікаве рішення, яке я бачив для програми GUI для Windows, - це те, що він записував дуже детальну інформацію про відстеження до "реєстратора польотів" під час запуску, а потім, коли ви закрили її, якщо у неї не було проблем, то просто видалили файл.
Якщо ж вона вийшла з ладу або зіткнулася з проблемою, файл не був видалений. Або якщо він виявить помилку, або при наступному запуску він помітить файл, і тоді він може вжити заходів, наприклад стиснути його (наприклад, 7zip) та надіслати його електронною поштою або іншим чином зробити доступним.
У багатьох системах сьогодні є автоматизована звітність про збої на центральному сервері (після перевірки з користувачами, наприклад, з міркувань конфіденційності).
Перегляд
Питання: Які інструменти ви використовуєте для перегляду журналів?
Відповідь: Якщо у вас кілька журналів з різних причин, ви будете використовувати кілька глядачів.
Блокнот / vi / Блокнот ++ або будь-який інший редактор тексту є основою для простого текстового журналу.
Якщо у вас є складні операції, наприклад, діяльність з передачами, то, очевидно, ви б скористалися спеціалізованим інструментом, таким як Viewer Trace Service. (Якщо вам це не потрібно, то текстовий редактор простіше).
Оскільки я звичайно реєструю інформацію про високий рівень до Журналу подій Windows, то це забезпечує швидкий спосіб структурованого огляду (шукайте досить значки про помилки / попередження). Починати полювання потрібно лише через текстові файли, якщо їх у журналі не вистачає, хоча принаймні журнал дає вихідну точку. (У цей момент переконайтеся, що переконайтеся, що ваші журнали мають узгоджені вбудовані елементи).
Як правило, Журнал подій Windows також робить ці значні події доступними для таких інструментів моніторингу, як MOM або OpenView.
Інші -
Якщо ви входите в базу даних, можна легко відфільтрувати і сортувати інформацію (наприклад, збільшити масштаб певного ідентифікатора діяльності. (За допомогою текстових файлів ви можете використовувати Grep / PowerShell або подібне для фільтрації за потрібним частинним GUID))
MS Excel (або інша програма електронних таблиць). Це може бути корисно для аналізу структурованої або напівструктурованої інформації, якщо ви можете імпортувати її правильними роздільниками, щоб різні значення йшли в різні стовпці.
Під час запуску послуги в налагодженні / тесті я зазвичай розміщую її в консольній програмі для простоти, я вважаю корисним кольоровий реєстратор консолі (наприклад, червоний для помилок, жовтий для попереджень тощо). Вам потрібно впровадити користувальницький слухач слідів.
Зауважте, що рамка не включає кольоровий консольний реєстратор або реєстратор баз даних, тому зараз вам потрібно буде записати їх, якщо вони вам потрібні (це не надто складно).
Мене справді дратує, що декілька фреймворків (log4net, EntLib тощо) витратили час, щоб переосмислити колесо і знову реалізували основні журнали, фільтрування та вхід до текстових файлів, Журналу подій Windows та XML-файлів, кожен із яких є власним. різний спосіб (виписки журналу у кожного різні); кожен з них реалізував власну версію, наприклад, реєстратора баз даних, коли більшість із них вже існувала, і все, що було потрібно, було ще пару слухачів слідів для System.Diagnostics. Говоріть про велику трату дублюючих зусиль.
Питання: Якщо ви будуєте рішення ASP.NET, чи використовуєте ви також моніторинг здоров'я ASP.NET? Чи включаєте виведення слідів у події моніторингу здоров'я? Що з Trace.axd?
Ці речі можна вмикати / вимикати за потреби. Я вважаю Trace.axd досить корисним для налагодження того, як сервер реагує на певні речі, але він, як правило, не корисний у сильно використовуваному середовищі або для довгострокового відстеження.
Питання: А як же користувацькі лічильники ефективності?
Для професійного додатку, особливо сервера / сервісу, я очікую, що він буде повністю забезпечений інструментами як з лічильниками монітора продуктивності, так і з входом у Журнал подій Windows. Це стандартні інструменти в Windows, і їх слід використовувати.
Вам потрібно переконатися, що ви включаєте інсталяторів для лічильників ефективності та журналів подій, які ви використовуєте; їх слід створити під час встановлення (при установці як адміністратор). Коли ваша програма працює нормально, вона не повинна мати права адміністратора (і тому не зможе створювати відсутні журнали).
Це хороший привід практикувати розробку як неадміністратор (мати окремий обліковий запис адміністратора, коли вам потрібно встановити служби тощо). Якщо ви записуєтеся до Журналу подій, .NET автоматично створить відсутній журнал при першому його написанні; якщо ви розвинетесь як не-адміністратор, ви спіймаєте це рано та уникнете неприємного сюрпризу, коли клієнт встановить вашу систему, а потім не зможе її використовувати, оскільки він не працює як адміністратор.