Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Звідки в коді йде цей вивід? (вдосконалюємо логи)

with 3 comments

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

Для вирішення такої проблеми я написав функцію watch_for_output, яка патчить sys.stdout та sys.stderr так що ті починають з кожним рядком що їм передають, виводити всі контактні дані того хто передає. Я помістив її в свою бібліотеку з всякими утилітами, тому використати її можна так:

import butils
butils.watch_for_output()

print 2 + 2

# OUT: test.py:4 print 2 + 2
# OUT: 4
# OUT: test.py:4 print 2 + 2 # print друкує ще перехід на новий рядок
# OUT: 

Біда тільки що коли вивід відбувається за допомогою не print, а наприклад якогось log.info, вийде таке:

2014-04-10 20:56:19,593 INFO zen.zenpython: Connecting to localhost:8789
/opt/zenoss/lib/python2.7/logging/__init__.py:863 stream.write(fs % msg)

Не дуже корисно… Але, ми бачимо в рядку лога таке: zen.zenpython. Це, скоріш за все, назва логера, а ми знаємо що логгер – сінглтон відносно назви (Note that Loggers are never instantiated directly, but always through the module-level function logging.getLogger(name). Multiple calls to getLogger() with the same name will always return a reference to the same Logger object. Logger objects). Тепер, ми можемо пропатчити його формат так, аби він друкував окрім всього іншого рядок і файл з якого викликаний:

import logging

FORMAT = '%(pathname)s:%(lineno)s %(message)s'
fmtr = logging.Formatter(FORMAT)
han = logging.StreamHandler()
han.setFormatter(fmtr)

log = logging.getLogger('zen.zenpython')
log.addHandler(han)

І ми отримуємо щось на зразок:

/opt/zenoss/Products/ZenHub/PBDaemon.py:602 Connecting to localhost:8789
2014-04-10 21:05:27,853 INFO zen.zenpython: Connecting to localhost:8789

Хей, тепер ми знаємо звідки можна починати копатись в коді!

Інші корисні поля, наприклад func (назва функції з якої відбувається логування) чи name (назва логера) описані в класі LogRecord.

Advertisements

Written by bunyk

Квітень 10, 2014 at 20:13

Оприлюднено в Кодерство

Tagged with

Відповідей: 3

Subscribe to comments with RSS.

  1. а чого у тебе два акка на гітхубі? =)

    danbst

    Квітень 27, 2014 at 10:19

    • Ми вирішили що аби членів команди SS було зручно відрізняти, всі їх аккаунти будуть починатись буквочками ss. 🙂

      bunyk

      Квітень 29, 2014 at 10:10

    • Крім того якщо працювати з двох аккаунтів, здається ніби в твого проекту є команда. 😀

      bunyk

      Квітень 29, 2014 at 10:11


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: