Вход в файл и консоль с различными обработчиками и форматами - PullRequest
0 голосов
/ 01 марта 2020

Я хотел бы иметь:

  • a main.log файл со всеми журналами выше уровня DEBUG для захвата из основного и импортированного модулей
  • консоль должна отображать только журналы уровня ОШИБКИ из основного и импортированных субмодулей.
    • Примечание. Возможно, у меня нет контроля над журналами обработки ошибок импортированных подмодулей.

Вот main.py код для этого:

# main.py importing a submodule
import logging

import submodule

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# log to console
c_handler = logging.StreamHandler()

console_format = logging.Formatter("[%(levelname)s] %(message)s")
c_handler.setFormatter(console_format)
c_handler.setLevel = logging.INFO

logger.addHandler(c_handler)

logger.error("This is an error!!! Logged to console")

# log to file from main
logfile = "./logging/main.log"

f_handler = logging.FileHandler(filename=logfile)

f_format = logging.Formatter("%(asctime)s: %(name)-18s [%(levelname)-8s] %(message)s")
f_handler.setFormatter(f_format)
f_handler.setLevel = logging.DEBUG

logger.addHandler(f_handler)

logger.debug("This is a debug error. Not logged to console, but should log to file")

... и submodule.py код ...

# submodule.py
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

formatter = logging.Formatter('%(levelname)s:%(name)s:%(message)s')

# log to console
c_handler = logging.StreamHandler()
c_handler.setFormatter(formatter)
logger.addHandler(c_handler)

logger.info("This is an info message from submodule, should be recorded in main.log!")
logger.debug("This is a debug message from submodule, also should be recorded in main.log!!")

Когда я запускаю main.py :

  • [ERROR] This is an error!!! Logged to console правильно отображается в консоли
  • Но ...
    • Консоль также показывает ...
      • INFO:submodule:This is an info message from submodule, should be recorded in main.log!
      • [DEBUG] This is a debug error. Not logged to console, but should log to file
    • main.log file показывает только yy-mm-dd hh:mm:ss: __main__ [DEBUG ] This is a debug error. Not logged to console, but should log to file. Он не показывает журналы из submodule.py

Оцените знание:

  • Куда я иду не так?
  • Что потребуется ли исправление кода?

РЕДАКТИРОВАТЬ: На основании @Dan D. предложение изменено submodule.py следующим образом:

# submodule.py
import logging

logger = logging.getLogger(__name__)

def logsomething():
    logger.info("This is an info message from submodule, should be recorded in main.log!")
    logger.debug("This is a debug message from submodule, also should be recorded in main.log!!")

... и программа записывает в консоль и файл соответственно.

Q. Если я хочу изменить формат сообщения только для submodule.py , это можно сделать через main.py ?

1 Ответ

1 голос
/ 01 марта 2020

Ваш подмодуль должен быть просто:

import logging

logger = logging.getLogger(__name__)

logger.info("This is an info message from submodule, should be recorded in main.log!")
logger.debug("This is a debug message from submodule, also should be recorded in main.log!!")

Тогда ваш основной модуль должен быть:

# main.py importing a submodule
import logging

logger = logging.getLogger(__name__)

# log to console
c_handler = logging.StreamHandler()

console_format = logging.Formatter("[%(levelname)s] %(message)s")
c_handler.setFormatter(console_format)
c_handler.setLevel(logging.INFO)

logging.getLogger().addHandler(c_handler)

# log to file from main
logfile = "./logging/main.log"

f_handler = logging.FileHandler(filename=logfile)

f_format = logging.Formatter("%(asctime)s: %(name)-18s [%(levelname)-8s] %(message)s")
f_handler.setFormatter(f_format)
f_handler.setLevel(logging.DEBUG)

logging.getLogger().addHandler(f_handler)
logging.getLogger().setLevel(logging.DEBUG)

import submodule

logger.error("This is an error!!! Logged to console")
logger.debug("This is a debug error. Not logged to console, but should log to file")

Редактировать: обработчики должны быть добавлены до запуска кода в подмодуле. Для этого import submodule был перемещен после кода, который устанавливает обработчики.

Обычно модули не должны иметь никаких вызовов журналирования верхнего уровня, поэтому все операции импорта могут выполняться наверху, а затем вызываемые объекты, использующие журналирование, косвенно вызываются кодом в if __name__=="__main__": после настройки журналирования.

...