Чому існує рівень TRACE, і коли я повинен використовувати його, а не DEBUG?


82

У Log4J, Slf4J та ще декількох інших системах ведення журналів на Java у вас є два рівні "розробника" для ведення журналів:

  • ВІДЛАГОДЖУВАТИ
  • СЛІД

Я розумію, що робить DEBUG, тому що пояснення зрозуміло:

Рівень DEBUG позначає дрібнозернисті інформаційні події, які найбільш корисні для налагодження програми.

Але рівень TRACE не дуже специфічний щодо випадку його використання:

Рівень TRACE позначає дрібніші інформаційні події, ніж ДЕБУГ

(Джерело: log4J JavaDoc )

Це не говорить мені, як і коли використовувати TRACE. Цікаво, що це не рівень вираженості, визначений у стандарті syslog . Гуглінг за різницею між TRACE і DEBUG лише здається, що "використовуйте DEBUG, о, і TRACE теж". Не вдалося знайти конкретного випадку використання для рівня TRACE. Найкраще, що я міг знайти, - це стара вікі-сторінка, яка обговорює заслуги існування рівня.

Це, як архітектор, викликає у моїй голові багато прапорів та питань. Якби молодий розробник попросив мене додати TRACE до своєї архітектури, я б бомбардував його запитаннями:

  • Наведіть декілька прикладів інформації, яку слід реєструвати в TRACE, а не в DEBUG?
  • Яку конкретну проблему я вирішую, записуючи цю інформацію?
  • У цих прикладах, які властивості вхідної інформації, що чітко розрізняють ведення журналу на рівні TRACE, а не на рівні DEBUG?
  • Чому ця інформація повинна пройти через інфраструктуру журналу?
    • Які переваги зберігати цю інформацію в журналах журналів, а не просто використовувати System.out.println?
    • Чому для цього краще використовувати журнал, а не налагоджувач?
  • Що може бути канонічним прикладом ведення журналу на рівні TRACE?
    • Які конкретні вигоди, які були досягнуті за допомогою реєстрації на рівні TRACE замість DEBUG у прикладі?
    • Чому ці здобутки важливі?
    • І навпаки: Яких проблем я уникнув, ввівши його в TRACE замість DEBUG?
    • Як інакше я міг вирішити ці проблеми? Чому журнал на рівні TRACE кращий, ніж ті інші рішення?
  • Чи слід у виробничому коді залишити оператор журналу рівня TRACE? Чому?

Але враховуючи, що він присутній у більшості основних рамків, я здогадуюсь, що це корисно для чогось? Отже ... що таке TRACE, і чим він відрізняється від DEBUG?


Є багато '?' у вищезазначеному питанні. Я настійно пропоную звузити питання до одного аспекту, на який можна повністю відповісти (а не на багато часткових відповідей).


2
Ну, я не дуже прошу загальної інформації про ведення журналів. Я просто хочу зрозуміти, чому рівень TRACE існує, і коли я повинен ним користуватися.
Лоран Бургу-Рой

3
@gnat Я перевірив питання, яке ви позначили як дублювання, і ніде це не пояснює випадок використання TRACE. Я хотів би ввічливо попросити зняти повторюваний прапор. (Якщо я не пропустив це питання, з яким ви пов’язали?)
Лоран Бургу-Рой,

1
@sd Це з документації log4J 1.2, я додав джерело у своєму запитанні.
Лоран Бургу-Рой

Відповіді:


59

Які приклади інформації, яка повинна реєструватися за допомогою TRACE, а не за допомогою DEBUG?

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

Загалом, trace буде включати всі налагодження (так само, як і налагодження включає всі попередження та помилки).

Яку конкретну проблему я вирішую, записуючи цю інформацію?

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

У цих прикладах, які властивості вхідної інформації, яка чітко розмежовує між веденням журналу на рівні TRACE, а не на рівні DEBUG?

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

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

Чому ця інформація повинна проходити через протокол інфраструктури?

Це не обов'язково. У деяких фреймворках є окремий мікросхеми.

Зазвичай він опиняється в журналах, оскільки у трагегерів та звичайних реєстраторів є подібні потреби щодо запису на диск / мережу, обробку помилок, обертання журналу тощо.

Чому для цього краще використовувати журнал, а не налагоджувач?

Оскільки налагоджувач може не вдатися приєднатися до проблемної машини. Можливо, ви не знаєте достатньо, щоб знати, де навіть встановити точки прориву або перейти через код. Можливо, ви не зможете надійно відтворити помилку в налагоджувальній машині, тому використовуйте журнали, щоб знайти її, "якщо вона трапиться".

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


3
Аспект "продуктивності" дійсно допомагає мені зрозуміти. Дякую!
Лоран Бургу-Рой

6
Я додам, що трасування можна використовувати в місцях, коли налагоджувач точки точки перелому заважатиме правильному виконанню коду, наприклад, обробникам переривань, таймерам і щільно зв'язаним багатопотоковим кодам.
andy256

@ andy256 - за моїм досвідом, реєстрація на рівні трас також порушує такі речі.
Теластин

@Telastyn Так, це, безумовно, може. Скільки залежить від допусків системи. Інженер повинен зрозуміти наявні інструменти та вибрати правильний для роботи.
andy256

15

Зауважте, що slf4j спеціально не рекомендує використовувати сліди ( http://slf4j.org/faq.html#trace ):

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

Особисто моє сподівання полягало б у тому, щоб простежити, щоб все реєструвало (наприклад, навіть такі речі, як "введена функція MyFunc з аргументами A, B, C на час Y"). Мінус цього полягає в тому, що це не тільки надзвичайно галасливо, але і, як правило, викликає проблеми з дисковим простором; Я б очікував, що такий журнал буде відключений під час звичайних операцій. Переваги полягають у тому, що це дає вам рівень інформації, подібний до того, який ви отримаєте при перегляді програми, у випадках, коли приєднання налагоджувача може бути менш практичним.

Взагалі, я вважаю, що цей слід зазвичай більше зусиль, ніж інші підходи.


1
У крайньому випадку, протокол рівня трас може забезпечити відтворюваний, оборотний журнал (у стилі журналу транзакцій бази даних) повного стану програми протягом усього виконання. Це простежується все , або, принаймні, все в процесі роботи :-)
Стів Джессоп

13

Рівні налагодження взагалі абсолютно довільні і можуть відрізнятися між мовами, бібліотеками та компаніями.

Це, як було сказано, ось як я бачив, як вони використовуються:

TRACE: використовується для показу потоку програми на логічному рівні. Увійшли до функції? Чи вибрав оператор "якщо" головну чи іншу гілку? Це кандидат на слід. Іншими словами, реєстрація трас зазвичай використовується для вказівки "ви тут". Це корисно в контексті інших операторів журналу, які можуть зафіксувати помилку чи іншу інформацію. Журнал слідів може допомогти визначити місце розташування в коді помилки або іншої події, зареєстрованої на іншому рівні.

DEBUG: використовується для демпінгу змінного стану, конкретних кодів помилок тощо. Наприклад: веб-служба може повернути код помилки 809214, який можна записати, поки програма каже користувачеві "зв’язок не вдався". Уявіть, що розробник отримує журнал із системи користувача задовго після того, як сталася помилка, і цікавитесь " чому стався збій?" це добре, щоб увійти на рівні налагодження. Інший приклад може бути, якщо помилка продовжує виникати у виробництві, але її важко відтворити, журнал налагодження певних змінних або подій у проблемному модулі допоможе повідомити розробникам стан програми, коли виникає помилка для усунення несправностей.

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

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

У цьому немає ніяких реальних обмежень, немає правил, які говорять про те, що ви повинні записатись певним чином. Лише широкі умови, до яких деякі бібліотеки чи програми можуть дотримуватися, а можуть і не дотримуватися.


9

Я думаю , що відмінну відповідь Теластина можна підсумувати моєму короткому правилу:

  • DEBUG лісозаготівля повинна бути здатна використовуватись у виробництві (але, як правило, все ще не працює нормально)
  • TRACE реєстрація може бути такою, що використання її у виробництві (крім певного / короткого сеансу) неможливо

6

Ось моє правило

error   you need        to do something
warn    you might need  to do something
info    you need        to log this in production
debug   you might need  to log this in production
trace   everything that is happening (no performance concerns)

Припущенням цього є те, що команда ops буде

  • завжди встановити виробництво на рівні журналу
  • може бути встановлено налагодження на рівні налагодження на рівні журналу
  • ніколи не встановлюють виробництво на рівні логотипу

Озброївшись цим припущенням, ось як ви, як розробник, можете використовувати рівні журналів ...

Проблема № 1) не надто сповільнюючи показники виробництва

debugвирішує №1. Це ви, як розробник, робите все можливе, щоб збалансувати інформацію, яка може знадобитися у виробництві, не надто багато шуму, ви сповільнюєте роботу машини. Ви говорите: "Це гарна ідея постійно реєструвати це у виробництві (якщо ви хочете)".

Завдання №2) наявність детальної інформації під час розробки

traceвирішує задачу №2. Ви абсолютно не хвилюєтесь, який вплив він матиме на виробничу машину, але вам потрібна ця інформація зараз, розробляючи код. Ви говорите: "Я не обіцяю, що це завжди добре записувати цю інформацію у виробництво".


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


2

Що може бути канонічним прикладом ведення журналу на рівні TRACE?

ENTRY / EXIT - журнали методу. Ці журнали допомагають відстежувати потік програми і, як правило, дуже корисні, коли:

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

  2. Деякі шахрайські функції мовчки відмовляються, поглинаючи виняток

Вони вимагають окремого рівня TRACE, а не просто використання DEBUG, оскільки включення ENTRY / EXIT журналів для кожного методу у вашій кодовій базі буде генерувати величезну кількість зайвих журналів, які нерозумно завжди бути , навіть у DEBUG-контексті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.