Файл конфигурации протоколов Python
Кажется, у меня возникают некоторые проблемы при попытке реализовать вход в мой проект python.
Я просто пытаюсь воспроизвести следующую конфигурацию:
Регистрация Python для нескольких целей
Однако вместо того, чтобы делать это внутри кода, я хотел бы иметь его в файле конфигурации.
Ниже мой конфигурационный файл:
[loggers]
keys=root
[logger_root]
handlers=screen,file
[formatters]
keys=simple,complex
[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
[formatter_complex]
format=%(asctime)s - %(name)s - %(levelname)s - %(module)s : %(lineno)d - %(message)s
[handlers]
keys=file,screen
[handler_file]
class=handlers.TimedRotatingFileHandler
interval=midnight
backupCount=5
formatter=complex
level=DEBUG
args=('logs/testSuite.log',)
[handler_screen]
class=StreamHandler
formatter=simple
level=INFO
args=(sys.stdout,)
Проблема в том, что мой вывод на экран выглядит так: 2010-12-14 11: 39: 04,066 - корень - ПРЕДУПРЕЖДЕНИЕ - 3
2010-12-14 11: 39: 04,066 - корень - ОШИБКА - 4
2010-12-14 11: 39: 04,066 - корень - КРИТИЧЕСКИЙ - 5
Мой файл выводится, но выглядит так же, как и выше (хотя с дополнительной информацией). Однако уровни отладки и информации также не выводятся.
Я на Python 2.7
Вот мой простой пример, показывающий сбой:
import os
import sys
import logging
import logging.config
sys.path.append(os.path.realpath("shared/"))
sys.path.append(os.path.realpath("tests/"))
class Main(object):
@staticmethod
def main():
logging.config.fileConfig("logging.conf")
logging.debug("1")
logging.info("2")
logging.warn("3")
logging.error("4")
logging.critical("5")
if __name__ == "__main__":
Main.main()
Ответы
Ответ 1
Похоже, вы установили уровни для ваших обработчиков, но не ваш регистратор. Уровень регистратора фильтрует каждое сообщение до того, как он достигнет своих обработчиков, а значение по умолчанию - WARNING
и выше (как вы можете видеть). Установка уровня корневого регистратора на NOTSET
, как и у вас, а также установка его на DEBUG
(или что-то самое низкое значение, которое вы хотите записать), должно решить вашу проблему.
Ответ 2
Добавление следующей строки в корневой журнал позаботилось о моей проблеме:
level=NOTSET
Ответ 3
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import logging.handlers
from logging.config import dictConfig
logger = logging.getLogger(__name__)
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
}
def configure_logging(logfile_path):
"""
Initialize logging defaults for Project.
:param logfile_path: logfile used to the logfile
:type logfile_path: string
This function does:
- Assign INFO and DEBUG level to logger file handler and console handler
"""
dictConfig(DEFAULT_LOGGING)
default_formatter = logging.Formatter(
"[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s",
"%d/%m/%Y %H:%M:%S")
file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8')
file_handler.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(default_formatter)
console_handler.setFormatter(default_formatter)
logging.root.setLevel(logging.DEBUG)
logging.root.addHandler(file_handler)
logging.root.addHandler(console_handler)
[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module
Я думаю, вы должны добавить disable_existing_loggers к false.