Answer the question
In order to leave comments, you need to log in
How to pass logging from imported modules to the main program?
There is a conMySQL module that connects to MySQL and generates an SQL query. dictionary output.
In the main MyProg program, I import conMySQL and use it.
In the main MyProg program, for logging errors, I use the logging module with writing to a file.
Both MyProg and conMySQL import the logging module
How can the main program MyProg get error logs from the conMySQL module... using logging in conMySQL?
Answer the question
In order to leave comments, you need to log in
To properly use the logging module, you need to create loggers in all your modules as follows:
import logging
log = logging.getLogger(__name__)
log = logging.getLogger(__name__)
class MyModel:
log = logging.getLogger(__name__ + '.MyModel')
# ...
if __name__ == '__main__':
logging.basicConfig(stream=sys.stderr, level='INFO', format='%(asctime)s %(levelname)-7s %(message)s')
if __name__ == '__main__':
# У вас может быть несколько разных способов форматировать код для разных мест:
formatter_simple = Formatter(u'%(relativeCreated)08d %(levelname)-7s %(message)s')
formatter_complex = Formatter(u'%(asctime)s %(levelname)-7s [%(filename)21s:%(lineno)-4d] %(message)s')
# Несколько разных хендлеров для перехвата нужного вида сообщений и отправки в правильное место:
handler_null = logging.NullHandler()
handler_screen = handler(fmt=formatter_simple, stream=sys.stderr)
handler_main_file = handler(
fmt=formatter_complex,
cls=logging.handlers.TimedRotatingFileHandler,
when='midnight',
backupCount=5,
encoding='utf-8',
filename=local_path('log/server.log'),
)
handler_errors_file = handler(
fmt=formatter_complex,
cls=logging.handlers.TimedRotatingFileHandler,
when='midnight',
backupCount=5,
encoding='utf-8',
filename=local_path('log/errors.log'),
level='ERROR',
)
# А потом описываем сами логгеры:
# это корневой логер, пропускает все сообщения через себя насквозь и в то же отдаёт их своим хендлерам
log_root = logger(None, level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
# этот логер перехватывает логи торнадо-приложения, пропускает через себя и отдаёт хендлерам:
log_app = logger('tornado.application', level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
# этот собирает логи событий модели уровня выше или равного INFO (не отладочные)
# и отдаёт соответствующим хендлерам, дальше для обработки свои сообщения не пускает
log_events = logger('app.model.events', level='INFO', propagate=0, handlers=[handler_errors_file, handler_events_file])
# этот логер съедает и отдаёт спец-хендлеру (он не показан выше, но должен быть) все логи http доступа
log_websrv = logger('tornado.access', level='DEBUG', propagate=0, handlers=[handler_websrv_file])
# этот логер глотает и гасит за ненадобностью все логи, которые генерит библиотека PIL при работе с PNG-файлами
log_pil = logger('PIL.PngImagePlugin', level='INFO', propagate=0, handlers=[handler_null])
log_pil
, log_websrv
and others are stored in separate variables, but in fact these variables are not used anywhere in the code. They may or may not be assigned at all. In the logging module, all loggers are registered globally in a list, and therefore nothing needs to be imported in each module, it is enough to create a logger by name. By this name, the logger is searched among the created loggers or a new one is created automatically. Logger names use dot notation, and it is convenient to filter them by name steps.In the main program, you create a logger, configure it as you need.
In all imports:
import logging
...
log = logging.get_logger('module name') # you can __name__
log.debug("logging ok")
All messages will be processed by the root logger.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question