Как придать сообщениям журнала текущую дату и время?

Я использую Python 3.9 и Django 3.2. У меня настроено логирование в файле settings.py

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

Когда я веду журнал в одном из своих классов, я делаю это следующим образом

import logging
...
class TransactionService:
    def __init__(self):
        self._logger = logging.getLogger(__name__)


    def my_method(self, arg1, arg2):
            ...
        self._logger.info("Doing some logging here.")
      

  

Как настроить регистратор так, чтобы при выводе сообщения в префикс ставились текущие дата и время?

Добавьте форматер к вашему регистратору. Например:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'prepend_date': {
            'format': '{levelname} {asctime}: {message}',
            'style': '{',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'prepend_data',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    },
}

Это сработало для меня (адаптировано из ответа thorndeux):

import logging.config

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'prepend_date': {
            'format': '{asctime} {levelname}: {message}',
            'style': '{',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'prepend_date',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    },
}

logging.config.dictConfig(LOGGING)
logging.info('foo')
logging.warning('bar')

печатает

2021-11-28 16:05:13,469 INFO: foo
2021-11-28 16:05:13,469 WARNING: bar

Ответ на ваш вопрос можно найти в официальной документации, пожалуйста, прочитайте полную статью.

import logging

FORMAT = '%(asctime)s  %(message)s'
logging.basicConfig(format=FORMAT)

logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.info("Doing some logging here.")

Это выведет:

2021-11-29 14:06:59,825  Doing some logging here.

В вашем примере не хватает formatters (добавьте к дикту LOGGING следующее):

LOGGING = {
    ...
    "formatters": {"console": {"format": "%(asctime)s %(message)s"}},
    # and add it to handlers
    "handlers": {"console": {"class": "logging.StreamHandler", "formatter": "console"}},
    ...
}

Другое дело, что вы можете захотеть изменить настройку логирования в классах на что-то вроде

import logging
logger = logging.getLogger(__name__)
...
class TransactionService:

    def my_method(self, arg1, arg2):
        ...
        logger.info("Doing some logging here.")

Полный пример вы также можете найти в официальной документации Django (последний из примеров в этом подразделе):

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}
Вернуться на верх