Ведение журнала Python. Как установить имя модуля в NullHandler - PullRequest
0 голосов
/ 25 марта 2020

Я пишу программу резервного копирования с несколькими модулями. В каждом из этих модулей есть несколько классов с некоторыми отладочными и информационными сообщениями. один из этих модулей называется logger.py, который отвечает за создание объекта logger с StreamHandler, RotateHandler и FileHandler, в то время как в другие модули я вставил NullHandler. Цель состоит в том, чтобы иметь возможность импортировать регистратор в файл main.py, который запускает программу и имеет один файл журнала. Здесь упрощена структура папок моего проекта:

├── modules
│      ├── __init__.py
│      ├── module1.py
│      ├── module2.py
│      ├── module3.py
│      ├── logger.py
|
└── main.py

Вот код logger.py:

def logger():
    log_name = mypath/mylog.log
    log = logging.getLogger()
    log.setLevel(logging.DEBUG)
    formatter = logging.Formatter("[%(name)s][%(levelname)s]%(funcName)20s =>%(message)s")
    file_handler = logging.FileHandler(log_name)
    file_handler.setFormatter(formatter)
    log.addHandler(file_handler)

...... other handlers......


return log

в module1, module2, module3 в начале файл, который я написал:

import logging.handlers

log = logging.getLogger('module_name')
null_handler = logging.NullHandler()
log.addHandler(null_handler)

в main.py:

from modules import logger

log = logger()
log.dubug("Some messages..")
log.info("other messages..")

Теперь это работает нормально, за исключением имени модуля, которое выводится как root в выводе, пока я хотел бы выйти с именем модуля, работающего в это время. Странно то, что вывод module1.py происходит как I w sh, а остальные нет.

Вот пример:

[module1][DEBUG]  myfunction =>   message in module1
[root][DEBUG]  <module>     =>    message in main
[root][DEBUG]  <module>     =>    message in main
[root][INFO]   <module>     =>    message in module2
[root][DEBUG]  <module>     =>    message in module3

установка __name__ в log = logging.getLogger() ничего не изменил

1 Ответ

0 голосов
/ 27 марта 2020

После некоторого исследования и большого количества испытаний я нашел решение. Чтобы иметь имя модуля в выводе журнала, вы можете двумя способами:

Установить журнал как свойство класса

import logging.handlers

log = logging.getLogger('module_name')
null_handler = logging.NullHandler()
log.addHandler(null_handler)

class MyClass:
    self.log = log

, а затем для каждого сообщения журнала внутри класс:

self.log.debug("This will have custome logger name!!")

выводится при запуске main.py:

[module_name][DEBUG]  <module>     =>    This will have custom logger name!!

Установить журнал как переменную класса

это решение даже лучше, поскольку это более гибко. Для каждого класса в одном модуле может быть настроено имя регистратора.

import logging.handlers

class Class1:

    log = logging.getLogger('class1')
    null_handler = logging.NullHandler()
    log.addHandler(null_handler)

self.log.debug("Im in Class1")

class Class2:
    log = logging.getLogger('class2')
    null_handler = logging.NullHandler()
    log.addHandler(null_handler)

self.log.debug("Im in Class2")

output:

[class1][DEBUG]  <module>     =>    Im in Class1
[class2][DEBUG]  <module>     =>    Im in Class2
...