می توانید logging را به طریقی دیگر با استفاده از ماژول و توابع کلاس یا با ایجاد یک فایل پیکربندی یا dictionary و بارگیری آن به ترتیب با استفاده از fileConfig () یا dictConfig () پیکربندی کنید. این موارد در صورتی مفید است که بخواهید پیکربندی ورود به سیستم خود را در یک برنامه در حال اجرا تغییر دهید.
در اینجا مثالی از پیکربندی وجود دارد:
[loggers]
keys=root,sampleLogger
[handlers]
keys=consoleHandler
[formatters]
keys=sampleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_sampleLogger]
level=DEBUG
handlers=consoleHandler
qualname=sampleLogger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=sampleFormatter
args=(sys.stdout,)
[formatter_sampleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
در فایل فوق ، دو logger وجود دارد ، یک handler و یک formatter. پس از مشخص شدن نام آنها ، با اضافه کردن کلمات logger ، handler و formatter قبل از اینکه نام آنها با یک زیر خط جدا شود ، پیکربندی می شوند.
برای بارگذاری این پرونده پیکربندی ، باید از () fileConfig استفاده کنید:
import logging
import logging.config
logging.config.fileConfig(fname='file.conf', disable_existing_loggers=False)
# Get the logger specified in the file
logger = logging.getLogger(__name__)
logger.debug('This is a debug message')
خروجی:
2018-07-13 13:57:45,467 - __main__ - DEBUG - This is a debug message
مسیر فایل پیکربندی به عنوان یک پارامتر به متد () fileConfig منتقل می شود و از پارامتر disable_existing_loggers برای نگهداری یا غیرفعال کردن logger هایی که هنگام فراخوانی عملکرد وجود دارند استفاده می شود. در صورت عدم ذکر ، به صورت پیش فرض به True تبدیل می شود.
در اینجا همان پیکربندی در قالب YAML برای رویکرد دیکشنری وجود دارد:
version: 1
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
loggers:
sampleLogger:
level: DEBUG
handlers: [console]
propagate: no
root:
level: DEBUG
handlers: [console]
در اینجا مثالی آورده شده است که نحوه بارگیری پیکربندی را از یک فایل yaml نشان می دهد:
import logging
import logging.config
import yaml
with open('config.yaml', 'r') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
logger = logging.getLogger(__name__)
logger.debug('This is a debug message')
خروجی:
2018-07-13 14:05:03,766 - __main__ - DEBUG - This is a debug message