Функция diamond.utils.log.setup_logging(), которая находится в файле src/diamond/utils/log.py, вызывается из функции main() исполняемого файла diamond при запуске демона:
····# Инициализация журналирования
····log = setup_logging(options.configfile, options.log_stdout)
Если значение options.log_stdout равно True, функция setup_logging() настроит средство ведения журнала со стандартным форматированием так, чтобы оно отправляло записи в стандартный поток выхода на уровне DEBUG. Это делается в следующем фрагменте кода:
##~~… Пропускаем все остальное…
def setup_logging(configfile, stdout=False):
····log = logging.getLogger('diamond')
····if stdout:
········log.setLevel(logging.DEBUG)
········streamHandler = logging.StreamHandler(sys.stdout)
········streamHandler.setFormatter(DebugFormatter())
········streamHandler.setLevel(logging.DEBUG)
········log.addHandler(streamHandler)
····else:
········##~~… Пропускаем это…
В противном случае он анализирует файл конфигурации с помощью функции logging.config.file.fileConfig() из стандартной библиотеки Python. Перед вами вызов функции — он выделен отступами, поскольку находится внутри предшествующего оператора if/else и блока try/except:
········logging.config.fileConfig(configfile,
························disable_existing_loggers=False)
Конфигурация журналирования игнорирует ключевые слова в конфигурационном файле, которые не связаны с журналированием. Так Diamond может использовать один и тот же конфигурационный файл как для своей конфигурации, так и для конфигурации журналирования. В примере конфигурационного файла, который располагается по адресу Diamond/conf/diamond.conf.example, среди прочих обработчиков определяется и обработчик журналирования:
### Настройки обработчиков
[handlers]
# обработчик(и) для журналирования
keys = rotated_file
Далее в файле конфигурации под заголовком «Настройки для журналирования» определяются примеры средств ведения журнала. Для получения более подробной информации смотрите документацию к конфигурационным файлам для журналирования (http://bit.ly/config-file-format).
Примеры из структуры Diamond
Diamond — это больше чем исполняемое приложение. Он также является библиотекой, которая предоставляет пользователям возможность создавать и применять собственные сборщики.
Мы продемонстрируем те элементы структуры пакета, которые нам нравятся, а затем изучим, как именно Diamond позволяет приложению импортировать и использовать определенные извне сборщики.
На схеме рис. 5.2 показан модуль сервера, взаимодействующий с тремя другими модулями проекта: diamond.handler, diamond.collector и diamond.utils.