Как правильно отключить логгеры строронних библиотек в Django приложении?

Рейтинг: 1Ответов: 1Опубликовано: 22.03.2023

Я пытаюсь отключить логгеры библиотеки colormath, поскольку они мне бесполезны и только мешают. Я не могу использовать фильтрацию, потому что речь идёт о логе docker контейнера, к которому я подключаюсь таким образом: docker logs -f djangopostgre-web-1 --details

Я пытался сделать это в методе AppConfig.ready() моего приложения, как указано в документации:

from django.apps import AppConfig
import logging
from colormath import chromatic_adaptation
from colormath import color_appearance_models
from colormath import color_conversions
from colormath import color_objects

logger = logging.getLogger(__name__)

def disable_logging(module):
    module_logger = logging.getLogger(module.__name__)
    module_logger.disabled = True
    logger.debug(f'{module_logger} logger is disabled')

class MainConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'main'

    def ready(self) -> None:
        disable_logging(chromatic_adaptation)
        disable_logging(color_appearance_models)
        disable_logging(color_conversions)
        disable_logging(color_objects)
        return super().ready()

Это не работает, логи всё равно появляются. У меня есть причины не изменять исходный код библиотеки. В исходной библиотеке логгеры регистрируются следующим образом:

# colormath.chromatic_adaptation.py

import logging

import numpy
from numpy.linalg import pinv

from colormath import color_constants

logger = logging.getLogger(__name__)

#...

Пример мусорного вывода в лог:

Converting LCHabColor (lch_l:85.0000 lch_c:40.0000 lch_h:250.5600) to <class 'colormath.color_objects.sRGBColor'>
  @ Conversion path: [<function LCHab_to_Lab at 0x7f6129552980>, <function Lab_to_XYZ at 0x7f6129552840>, <function XYZ_to_RGB at 0x7f61295531a0>]
  * Conversion: LCHabColor passed to <function LCHab_to_Lab at 0x7f6129552980>()
  |->  in LCHabColor (lch_l:85.0000 lch_c:40.0000 lch_h:250.5600)
  |-< out LabColor (lab_l:85.0000 lab_a:-13.3128 lab_b:-37.7196)
  * Conversion: LabColor passed to <function Lab_to_XYZ at 0x7f6129552840>()
  |->  in LabColor (lab_l:85.0000 lab_a:-13.3128 lab_b:-37.7196)
  |-< out XYZColor (xyz_x:0.5798 xyz_y:0.6601 xyz_z:0.9809)
  * Conversion: XYZColor passed to <function XYZ_to_RGB at 0x7f61295531a0>()
  |->  in XYZColor (xyz_x:0.5798 xyz_y:0.6601 xyz_z:0.9809)
   \- Target RGB space: <class 'colormath.color_objects.sRGBColor'>
   \- Target native illuminant: d65
   \- XYZ color's illuminant: d50
   \* Applying transformation from d50 to d65 
   \* Applying adaptation matrix: bradford
   \*   New values: 0.601, 0.671, 1.298
   \* Applying RGB conversion matrix: type->xyz_to_rgb
  |-< out sRGBColor (rgb_r:0.5551 rgb_g:0.8704 rgb_b:1.1100)
 Converting LCHabColor (lch_l:85.0000 lch_c:40.0000 lch_h:250.5600) to <class 'colormath.color_objects.sRGBColor'>
  @ Conversion path: [<function LCHab_to_Lab at 0x7f6129552980>, <function Lab_to_XYZ at 0x7f6129552840>, <function XYZ_to_RGB at 0x7f61295531a0>]
  * Conversion: LCHabColor passed to <function LCHab_to_Lab at 0x7f6129552980>()
  |->  in LCHabColor (lch_l:85.0000 lch_c:40.0000 lch_h:250.5600)
  |-< out LabColor (lab_l:85.0000 lab_a:-13.3128 lab_b:-37.7196)
  * Conversion: LabColor passed to <function Lab_to_XYZ at 0x7f6129552840>()
  |->  in LabColor (lab_l:85.0000 lab_a:-13.3128 lab_b:-37.7196)
  |-< out XYZColor (xyz_x:0.5798 xyz_y:0.6601 xyz_z:0.9809)
  * Conversion: XYZColor passed to <function XYZ_to_RGB at 0x7f61295531a0>()
  |->  in XYZColor (xyz_x:0.5798 xyz_y:0.6601 xyz_z:0.9809)
   \- Target RGB space: <class 'colormath.color_objects.sRGBColor'>
   \- Target native illuminant: d65
   \- XYZ color's illuminant: d50
   \* Applying transformation from d50 to d65 
   \* Applying adaptation matrix: bradford
   \*   New values: 0.601, 0.671, 1.298
   \* Applying RGB conversion matrix: type->xyz_to_rgb
  |-< out sRGBColor (rgb_r:0.5551 rgb_g:0.8704 rgb_b:1.1100)
 Converting LCHabColor (lch_l:85.0000 lch_c:40.0000 lch_h:323.2800) to <class 'colormath.color_objects.sRGBColor'>
  @ Conversion path: [<function LCHab_to_Lab at 0x7f6129552980>, <function Lab_to_XYZ at 0x7f6129552840>, <function XYZ_to_RGB at 0x7f61295531a0>]
  * Conversion: LCHabColor passed to <function LCHab_to_Lab at 0x7f6129552980>()
  |->  in LCHabColor (lch_l:85.0000 lch_c:40.0000 lch_h:323.2800)
  |-< out LabColor (lab_l:85.0000 lab_a:32.0627 lab_b:-23.9162)
  * Conversion: LabColor passed to <function Lab_to_XYZ at 0x7f6129552840>()
  |->  in LabColor (lab_l:85.0000 lab_a:32.0627 lab_b:-23.9162)
  |-< out XYZColor (xyz_x:0.7877 xyz_y:0.6601 xyz_z:0.8014)
  * Conversion: XYZColor passed to <function XYZ_to_RGB at 0x7f61295531a0>()
  |->  in XYZColor (xyz_x:0.7877 xyz_y:0.6601 xyz_z:0.8014)
   \- Target RGB space: <class 'colormath.color_objects.sRGBColor'>
   \- Target native illuminant: d65
   \- XYZ color's illuminant: d50
   \* Applying transformation from d50 to d65 
   \* Applying adaptation matrix: bradford
   \*   New values: 0.788, 0.661, 1.062
   \* Applying RGB conversion matrix: type->xyz_to_rgb
  |-< out sRGBColor (rgb_r:1.0036 rgb_g:0.7488 rgb_b:1.0137)
 Converting LCHabColor (lch_l:85.0000 lch_c:40.0000 lch_h:323.2800) to <class 'colormath.color_objects.sRGBColor'>

Таких записей очень много, ведь я конвертирую десятки цветов, пользуясь colormath.

Ответы

▲ 1Принят

Да решение менять исходники сторонней либы не лучшее. Но к сожалению в своем вопросе Вы не приводите как именно делали конфигурацию. Однако в другом файле документации #configuring-logging Есть пример:

settings.py

import os

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'WARNING',
    },
}

И я полагаю первая опция disable_existing_loggers установленная в True должна отключить все существующие логеры.

Путем настройки конфига удалось избавиться от выводимых логов таким образом:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'DEBUG',
    },
    'loggers': {
        'colormath': {
            'handlers': ['console'],
            'level': 'ERROR',
            'propagate': False,
        },
    },
}

Т.е. теперь логи будут выводиться только в случае ошибок.