import logging logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True)
fname
- имя файла,defaults=None
- словарь значений по умолчанию,disable_existing_loggers=True
- совместимость со старыми версиями.Функция logging.config.fileConfig()
читает конфигурацию, поддерживаемую модулем configparser
из файла fname
. Формат файла должен быть таким, как описано в "Формате файла конфигурации".
Эта функция может вызываться несколько раз из приложения, что позволяет конечному пользователю выбирать из различных предварительно настроенных конфигураций, если разработчик предоставляет механизм для представления выбора и загрузки выбранной конфигурации.
Аргумент fname
- имя файла в качестве строки или файлоподобный объект. Создается экземпляр Configparser
и конфигурация, считываемая им из объекта, передается в fname
. Если у него есть метод readline()
, то он считается объектом открытого файла и читается с использованием read_file()
. В противном случае предполагается, что это имя файла и передается в метод file.read()
встроенной функции open()
.
Аргумент defaults
- словарь значений по умолчанию для передачи в ConfigParser
.
Если значение аргумент disable_existing_loggers=False
, то средства ведения журнала, которые существуют при выполнении этого вызова, остаются включенными. По умолчанию установлено значение True
, поскольку это разрешает старое поведение в обратно-совместимом виде. Это приводит к отключению любых существующих регистраторов без полномочий root
, если только они или их предки не указаны явно в конфигурации регистратора.
[loggers] keys=root,logger [handlers] keys=FileHandler [formatters] keys=loggerFormatter [logger_root] level=DEBUG handlers=FileHandler [logger_logger] level=DEBUG handlers=FileHandler qualname=logger propagate=0 [handler_FileHandler] class=FileHandler level=DEBUG formatter=loggerFormatter args=('example.log',) [formatter_loggerFormatter] format=[%(asctime)s] [%(name)s] [%(levelname)s] > %(message)s datefmt=%Y-%m-%d %H:%M:%S
Формат файла конфигурации функции logging.config.fileConfig()
основан на функциональности модуля configparser
.
Файл должен содержать разделы, с названиями [loggers]
, [handlers]
и [formatters]
, которые идентифицируют по имени сущности каждого типа. Для каждого такого объекта есть отдельный раздел, который определяет, как этот объект настроен. Таким образом, для регистратора log01
, указанного в разделе [loggers]
, соответствующая конфигурация будет содержатся в разделе [logger_log01]
. Аналогично, обработчик hand01
, указанный в разделе [handlers], будет иметь свою конфигурацию, хранящуюся в разделе с именем [handler_hand01]
, в то время как объект форматирования form01
, указанный в разделе [formatters]
будет иметь свою конфигурацию, указанную в разделе [formatter_form01]
, Конфигурация корневого регистратора должна быть указана в разделе с именем [logger_root]
.
Примечание. API-интерфейс fileConfig()
старше, чем API-интерфейс dictConfig()
и не предоставляет функциональных возможностей для покрытия определенных аспектов ведения журнала. Например используя fileConfig()
нельзя настроить объекты logging.Filter
, которые обеспечивают фильтрацию сообщений за пределами простых целочисленных уровней. Если необходимо использовать экземпляры Filter
в конфигурации журналирования, то нужно будет использовать функцию logging.config.dictConfig()
.
Обратите внимание, что будущие улучшения функциональности конфигурации будут добавляться в dictConfig()
, поэтому стоит подумать о переходе на этот более новый API.
Примеры разделов в файле конфигурации:
[loggers] keys=root,log02,log03,log04,log05,log06,log07 [handlers] keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09 [formatters] keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
Корневой регистратор должен указать уровень и список обработчиков. Пример раздела корневого регистратора:
[logger_root] level=NOTSET handlers=hand01
Уровень логирования level
может быть одним из: DEBUG
, INFO
, WARNING
, ERROR
, CRITICAL
или NOTSET
. Только для корневого регистратора NOTSET
означает, что будут регистрироваться все сообщения. Значения уровня eval()
используются в контексте пространства имен пакета логирования.
Запись обработчиков handlers
представляет собой разделенный запятыми список имен обработчиков, который записывается в разделе [handlers]
. Эти имена должны иметь соответствующие разделы в файле конфигурации.
Для регистраторов Logger
, отличных от корневого регистратора, требуется некоторая дополнительная информация. Это иллюстрируется следующим примером.
[logger_parser] level=DEBUG handlers=hand01 propagate=1 qualname=compiler.parser
Записи об уровне логирования и обработчиках интерпретируются как для корневого регистратора, за исключением того, что если уровень НЕ корневого регистратора указан как NOTSET
, то система опрашивает регистраторы выше по иерархии для определения эффективного уровеня регистратора. Запись распространения установлена в 1, чтобы указать, что сообщения должны распространяться на обработчики выше иерархии регистратора от этого регистратора или в 0 - сообщения не распространяются на обработчики вверх по иерархии. Запись qualname
- это имя иерархического канала регистратора, то есть имя, используемое приложением для получения регистратора.
Разделы, которые определяют конфигурацию обработчика:
[handler_hand01] class=StreamHandler level=NOTSET formatter=form01 args=(sys.stdout,)
Запись class
указывает класс обработчика как определено eval()
в пространстве имен пакета регистрации. Уровень логирования интерпретируется как для регистраторов, а NOTSET
используется для обозначения "регистрировать все".
Запись formatter
указывает имя ключа объекта форматирования для этого обработчика. Если пусто, используется форматтер по умолчанию logging._defaultFormatter). Если указано имя, то оно должно появиться в разделе
[formatters]` и иметь соответствующий раздел в файле конфигурации.
Запись args
, представляет собой список аргументов конструктора для класса обработчика. Смотрите примеры ниже, чтобы понять, как создаются типичные записи. Если args
не указано, то по умолчанию используется значение ()
.
Необязательная запись kwargs
, является словарем dict
для конструктора класса обработчика. Если не указано, то по умолчанию используется {}
.
[handler_hand02] class=FileHandler level=DEBUG formatter=form02 args=('python.log', 'w') [handler_hand03] class=handlers.SocketHandler level=INFO formatter=form03 args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT) [handler_hand04] class=handlers.DatagramHandler level=WARN formatter=form04 args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT) [handler_hand05] class=handlers.SysLogHandler level=ERROR formatter=form05 args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER) [handler_hand06] class=handlers.NTEventLogHandler level=CRITICAL formatter=form06 args=('Python Application', '', 'Application') [handler_hand07] class=handlers.SMTPHandler level=WARN formatter=form07 args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject') kwargs={'timeout': 10.0} [handler_hand08] class=handlers.MemoryHandler level=NOTSET formatter=form08 target= args=(10, ERROR) [handler_hand09] class=handlers.HTTPHandler level=NOTSET formatter=form09 args=('localhost:9022', '/log', 'GET') kwargs={'secure': True}
Разделы, которые определяют конфигурацию объекта форматирования:
[formatter_form01] format=F1 %(asctime)s %(levelname)s %(message)s datefmt= class=logging.Formatter
Запись format
- это общая строка формата, а запись datefmt
- строка формата даты/времени, совместимая с time.strftime()
.
Если datefmt
пуст, то это эквивалентно указанию строки формата даты '%Y-%m-%d %H:%M:%S'
. Этот формат также определяет миллисекунды, которые добавляются к результату с разделителем запятых. Пример времени в этом формате: 2003-01-23 00: 29: 50,411
.
Запись class
является необязательной и указывает имя класса Formatter
. Этот параметр полезен для создания экземпляра подкласса Formatter
. Подклассы Formatter
могут представлять трассировки исключений в расширенном или сжатом формате.