Django использует собственный модуль logging python для ведения системного журнала. Таким образом, Django просто дает возможность настроить ведение журнала, но внутренне модуль ведения журнала python будет отвечать за ведение журнала.

Если вы новичок в ведении журнала или хотите изучить дополнительные темы в журнале, я бы порекомендовал вам сначала просмотреть мою статью о Ведение журнала Python, а затем продолжить эту статью.

Прежде чем двигаться дальше, убедитесь, что вы знаете об этих 4 компонентах ведения журнала.

  • Регистраторы
  • Обработчики
  • Фильтры
  • Форматировщики

Как я уже упоминал, я объяснил все эти компоненты на примерах в статье выше.

Django использует метод dictConfig () модуля ведения журнала Python для настройки ведения журнала в приложении и создания средств ведения журнала, обработчиков, фильтров и средств форматирования соответственно. Конфигурация является частью основной функции Django setup (), которая выполняется, когда вы запускаете команду runserver.

Давайте посмотрим на пример

Итак, что означает приведенный выше код для Django

'version': 1,

В этом заявлении говорится, что Django использует версию 1 dictConfig.

'disable_existing_loggers': True,

Как указано в имени переменной, она отключит все существующие регистраторы (регистраторы по умолчанию, если ведение журнала не настроено).

Да, догадались, что Django по умолчанию создаст внутри себя несколько регистраторов, и вы можете отключить их с помощью этих ключей. Эта конфигурация не удаляет регистраторы, а просто отключает их. Просто выполните глобальный поиск в своем проекте Django на странице LOGGING, и вы увидите, где все это используется.

Помимо этого, python в основном заботится о ведении журнала, поэтому посмотрите на метод configure () в python /logging/config.py, чтобы понять его лучше . Все очень просто.

'root': { 
     'level': 'WARNING',   
     'handlers': ['general'],  
},

root - это средство ведения журнала по умолчанию для модуля ведения журнала Python, и в соответствии с конфигурацией уровень журнала установлен на предупреждение, а обработчик, который мы будем использовать, является общим обработчиком. Поскольку регистраторы имеют концепцию иерархии (мы увидим это в следующих разделах), регистратор по умолчанию называется root.

'formatters': {
        'default': {  
          'format': '%(levelname)s %(asctime)s %(message)s'     
         }   
 },

Ключевые средства форматирования будут содержать все возможные форматы сообщений журнала, и вы можете назначить любой из них определенным вами средствам ведения журнала.

'handlers': {
        'general': {
            'level': 'INFO',
            'class': 'logging.handlers.WatchedFileHandler',
            'formatter': 'default',
            'filename': 'django/log/general.log'
        },
        'user': {
            'level': 'INFO',
            'class': 'logging.handlers.WatchedFileHandler',
            'formatter': 'default',
            'filename': 'django/log/user.log'
        }
    },

Здесь вы можете определить свои обработчики, где вы можете установить уровень журнала, класс (FileHandler или StreamHandler или любой другой), средство форматирования и имя файла в дело fileHandler. Убедитесь, что у пользователя, запускающего приложение Django, есть права на запись в эти файлы.

'loggers': {
        'general': {
            'level': 'INFO',
            'handlers': ['general'],
            'propagate': False,
        },
        'user': {
            'level': 'INFO',
            'handlers': ['user'],
            'propagate': False,
        }
    }

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

Распространение

Прежде чем понять это, нам нужно понять иерархию в регистраторах, о которой я упоминал выше, поэтому предположим, что у вас есть структура модуля, как показано ниже в вашем коде.

User
 |
  ---> Balance
          |
           ---> Transactions

Как видите, у них есть иерархия, и, допустим, у каждого из них есть отдельные регистраторы для записи соответствующих сообщений. Допустим, у нас есть сценарий, при котором в случае каких-либо исключений в транзакциях мы должны регистрировать их в журнале пользователя и баланс как транзакции. принадлежат пользователю. В таком сценарии вы можете определить регистратор, используя оператор точки, который определяет иерархию

logger = logging.getLogger('user.balance.transactions')

Теперь у нас есть три регистратора - пользователь, родительский элемент user.balance, который снова является родительским элементом для user.balance.transactions. Вы можете установить обработчики для регистратора пользователей, который является корнем этой иерархии, и этот обработчик будет собирать все журналы из корня и всех его регистраторов поддерева, то есть, если есть какой-либо журнал на нижнем уровне дерева он также будет захвачен всеми его родительскими регистраторами. Это называется распространением журнала на родительский объект.

Теперь вы настраиваете это распространение с помощью ключа

'propagate': False

Я считаю, что поддержание иерархии усложняет ситуацию, но это полностью зависит от вашего решения, структуры проекта и требований.

Я надеюсь, что мы рассмотрели все, что касается входа в Django , и если вы новичок в Django, я бы порекомендовал вам ознакомиться с моей статьей

Создание и понимание вашего первого проекта Django

Я также прилагаю свой код для справки



Если вам понравилась статья, поставьте 👏. Спасибо за прочтение.

P.S: Если есть сомнения, напишите мне в Linkedin.